Gewusst wie: senden einer Zeichenkette über PostMessage?
Innerhalb meiner app, ich will eine Nachricht senden, die einen dialog aus einem anderen thread.
Ich möchte an einem std::exception abgeleiteten Klasse, die Referenz auf den dialog.
Etwas wie dieses:
try {
//do stuff
}
catch (MyException& the_exception) {
PostMessage(MyhWnd, CWM_SOME_ERROR, 0, 0); //send the_exception or the_exception.error_string() here
}
Möchte ich die Meldung in meinem dialog und zeigen die Fehler, die in the_exception.error_string()
LPARAM CMyDlg::SomeError(WPARAM, LPARAM)
{
show_error( ?????
return 0;
}
vorbei an der std::string the_exception.error_string()
mit PostMessage wäre auch ok, denke ich.
InformationsquelleAutor der Frage rec | 2009-08-24
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie sich nicht über die Adresse des Strings im PostMessage, da der string wahrscheinlich ist thread-lokal auf dem stack. Durch die Zeit, die den anderen thread, es aufnimmt, es könnte zerstört worden sein.
Stattdessen sollten Sie erstellen Sie eine neue Zeichenfolge, oder exception-Objekt über neue und übergeben deren Adresse in dem anderen thread (über den WPARAM oder LPARAM-parameter in PostMessage.) Den anderen thread, dann besitzt das Objekt und ist verantwortlich für die Zerstörung.
Ist hier einige Beispiel-code zeigt, wie dies getan werden könnte:
InformationsquelleAutor der Antwort Michael
Solange Sie innerhalb eines Prozesses einfach die übergabe eines void* Zeiger und einige Sorgfalt auf die Lebensdauer von Objekten sind genug.
Wenn SendMessage übergeben Sie es in LPARAM als void* casten, und der client uncast es zurück zu Ihrem string-Typ. Da SendMessage ist synchronsind Sie sicher:
Wenn Sie möchten, verwenden Sie PostMessage dann müssen Sie eine explizite hand aus, da der Aufruf asynchron ist: machen Sie eine Kopie des Strings auf dem heap, und durch aufrufen der PostMessage Sie bestanden haben, die löschen Sie responsability an der calee (dialog).
Wenn Sie gehen out-of-process (MyhWnd gehört zu einem anderen Prozess), dann ist eine ganz andere Geschichte, und Sie haben zu Marshallen Sie Ihre Nachricht in etwas wie eine Globale atom.
InformationsquelleAutor der Antwort Remus Rusanu
Solange Sie wissen, dass Ihre Fenster (Instanz
CMyDlg
) wird noch nach der Veröffentlichung der Nachricht können Sie einfach speichern Sie die Fehler-string in eine member-variable und Lesen Sie diese in Ihrem message-handler.InformationsquelleAutor der Antwort Alan