Leana Geschrieben 10. Februar 2003 Geschrieben 10. Februar 2003 ich ruf den thread auf und schicke mit PostThreadMessage (user defined message)die lösungen an die message queue UINT CSystemInfo::ProcessInfoThread(LPVOID pParam) { ProcParam *Par = (ProcParam*) pParam; int iInfoArt = Par->iInfoArt; CString strProzess = Par->strProzess; int k = 0; CSystemInfo Sys; char achCounter[256] = TEXT(""); LONG lAusgabe = -1; DWORD dThreadID; BOOL bAdd = Sys.CounterSetzen(achCounter, iInfoArt, strProzess); if(bAdd) { while (k==0) { long lAusgabe = Sys.GetNewValuesForProcess(); if(lAusgabe > -1) { WPARAM wParam = (WPARAM)&lAusgabe; LPARAM lParam = (LPARAM)&Par; dThreadID = GetCurrentThreadId(); BOOL bOk = PostThreadMessage(dThreadID, WM_GETPROCMESS, wParam, lParam); if(bOk == 0) { DWORD d = GetLastError(); BOOL bFalscheId; if(d == ERROR_INVALID_THREAD_ID ) bFalscheId = TRUE; else bFalscheId = FALSE; } Sleep(1000); } } } return 0; } wenn ich nun die messages holen möchte, bekomm ich nichts zurück! siehe code! void CCErweiterungSnapShotDlg::OnOK() { // TODO: Add extra validation here MSG msg; BOOL bgeht = PeekMessage(&msg, NULL, WM_GETPROCMESS, WM_GETPROCMESS,PM_NOREMOVE ); LONG laus = (long)msg.wParam; UINT i = msg.message; ProcParam *Par = (ProcParam*) msg.lParam; int iInfoArt = Par->iInfoArt; CString strProzess = Par->strProzess; } kann mir jemand helfen!!!:confused: Zitieren
Guybrush Threepwood Geschrieben 10. Februar 2003 Geschrieben 10. Februar 2003 Hi, ich hab zwar nicht so ganz durchgeblickt:rolleyes: , aber ProcessInfoThread() ist doch in einem anderen Thread wie OnOK(), oder? Wenn ja, dann liegt der Fehler, glaube ich ,hier: dThreadID = GetCurrentThreadId(); BOOL bOk = PostThreadMessage(dThreadID, WM_GETPROCMESS, wParam, lParam); [/PHP] Du holst dir die Thread ID von dem Thread indem ProcessInfoThread() läuft und schickst die Nachricht dann auch an diesen. Ich hoffe ich habs richtig verstanden. Gruß Guybrush Zitieren
Leana Geschrieben 10. Februar 2003 Autor Geschrieben 10. Februar 2003 ich erstelle ja mit AfxBeginThread den neuen thread (ProcessInfoThread) und hole von diesem dann die Thread ID!!! PostThreadMessage ist ja nicht auf ein fenster oder so bezogen sonden nur auf den neu erstellten thread und bei meinem fenster will ich dann zu diesem thread die messages haben! Kennung dazu ist ja der filer (WM_GETPROCMESS)!!! Zitieren
Guybrush Threepwood Geschrieben 10. Februar 2003 Geschrieben 10. Februar 2003 Achso, dann hab ich das falsch verstanden. Hast du mal den Rückgabewert von PeekMessage() überprüft? Zitieren
Leana Geschrieben 10. Februar 2003 Autor Geschrieben 10. Februar 2003 Ja ich bekomm immer 0 zurück! also das keine message vorhanden ist! ich weiß net woran das liegen kann! Zitieren
Guybrush Threepwood Geschrieben 10. Februar 2003 Geschrieben 10. Februar 2003 Doch nochmal zum verständnis: Werden die beiden oben genannten Funktionen vom selben Thread verarbeitet? Zitieren
Leana Geschrieben 10. Februar 2003 Autor Geschrieben 10. Februar 2003 naja ich hab meine fensterklasse, wo ich den thread aufrufe, der aber in eine anderen klasse steckt, und die messages wieder abrufen will! Klasse A -> Klasse B Aufruf das Thread beginnen soll -> ausführen und PostThreadMessage() aufrufen über eine methode von klasse B später wird hier mit PeekMessage versucht die messages zu bekommen funktioniert nicht hoffe das ist jetzt verständlich Zitieren
Klotzkopp Geschrieben 10. Februar 2003 Geschrieben 10. Februar 2003 PeekMessage musst du schon in dem Thread aufrufen, an den du die Nachrichten geschickt hast. Zitieren
Guybrush Threepwood Geschrieben 10. Februar 2003 Geschrieben 10. Februar 2003 hoffe das ist jetzt verständlich Immer noch nicht so ganz:rolleyes: Die Funktion OnOk() wird doch bestimmt aufgerufen wenn ein OK Button in einem Fenster geklickt wird, oder? Wenn ja, dann schick die Nachricht mal nicht an den Thread, sondern an das Fenster. Eine andere Möglichkeit wäre die Nachricht in globalen Variablen abzuspeichern, dann kannst du aus jeder Funktion draufzugreifen. Zitieren
Guybrush Threepwood Geschrieben 10. Februar 2003 Geschrieben 10. Februar 2003 Originally posted by Klotzkopp PeekMessage musst du schon in dem Thread aufrufen, an den du die Nachrichten geschickt hast. Genau das hab ich doch gemeint. Zitieren
Klotzkopp Geschrieben 10. Februar 2003 Geschrieben 10. Februar 2003 Originally posted by Guybrush Threepwood Genau das hab ich doch gemeint. Ich weiß Ich bin mir aber nicht sicher, ob Leana das so verstanden hat. @Leana: Was du machst, ist in etwa folgendes: -Thread A startet Thread B. -Thread B schreibt mehrere Briefe an sich selbst. -Thread A schaut in seinen Briefkasten. Das da nichts drin ist, war ja zu erwarten. Was man da machen kann, hängt davon ab, wozu du das ganze überhaupt machst. Geht es nur darum, dass die GUI noch reagiert, während du im Hintergrund etwas anderes machst? Zitieren
Guybrush Threepwood Geschrieben 10. Februar 2003 Geschrieben 10. Februar 2003 Ich weiß Na gut du hast es deutlicher erklärt:) Wenn man aber, wie ich gesagt habe, die Nachricht nicht an den Thread, sondern an das Fenster schickt dürften keine Probleme auftauchen. Zitieren
Klotzkopp Geschrieben 10. Februar 2003 Geschrieben 10. Februar 2003 Originally posted by Guybrush Threepwood Wenn man aber, wie ich gesagt habe, die Nachricht nicht an den Thread, sondern an das Fenster schickt dürften keine Probleme auftauchen. Da bin ich mir nicht so sicher. Offenbar sollen die Nachrichten ja erst in OnOK abgearbeitet werden. Also müsste man sie bis dahin in einer separaten Queue zwischenspeichern. Zitieren
Guybrush Threepwood Geschrieben 10. Februar 2003 Geschrieben 10. Februar 2003 Originally posted by Klotzkopp Da bin ich mir nicht so sicher. Offenbar sollen die Nachrichten ja erst in OnOK abgearbeitet werden. Also müsste man sie bis dahin in einer separaten Queue zwischenspeichern. Irgenwie hab ich immer noch nicht kappiert was das Programm eigentlich machen soll. Zitieren
Klotzkopp Geschrieben 10. Februar 2003 Geschrieben 10. Februar 2003 Originally posted by Guybrush Threepwood Irgenwie hab ich immer noch nicht kappiert was das Programm eigentlich machen soll. Ich auch nicht. Deswegen wäre es besser, wenn Leana uns über Sinn und Zweck der Aktion aufklärt. Sonst ist das alles nur Spekulatius. Zitieren
Leana Geschrieben 10. Februar 2003 Autor Geschrieben 10. Februar 2003 Bin wieder da!!! Also ich hab so einen art task manager, der mir immer die CPU auslastung der einzelnen prozessen anzeigen soll! so und da ich ja für alle prozzesse immer zur gleichen zeit die CPU auslastung brauche, wollte ich für jeden prozess ein thread bauen der immer die CPU auslastung abfrägt und in eine message queue steckt! diese messages soll dann mein fenster der reihe nach abrufen!! so das ist das grundprinzip!!! also mein Fenster startet den thread über aufruf einer methode von einem objekt meiner klasse die die ganz verarbeitung übernimmt (datenkapselung) und da wird dann eben postthreadmessage aufgerufen! das geht dann an die queue vom thread den ich für den prozess gestartet habe!!! nun soll das fenstern in diese Queue reinschauen und die messages holen!!! verstanden?? mit euren ganzen threads verstehe ich net! also ich hab mein thread für das fenster und die verarbeitung, oder? und dann eben noch die selbst erstellen threads für die prozesse! und was ist nun der fehler? :-) :confused: Zitieren
Klotzkopp Geschrieben 10. Februar 2003 Geschrieben 10. Februar 2003 Originally posted by Leana und da wird dann eben postthreadmessage aufgerufen! das geht dann an die queue vom thread den ich für den prozess gestartet habe!!! nun soll das fenstern in diese Queue reinschauen und die messages holen!!!Und genau das funktioniert nicht. Du kannst mit PeekMessage nicht die Queue eines anderen Threads abfragen. Um beim Briefkastenvergleich zu bleiben: Du kannst nur in deinen eigenen Briefkasten gucken, und dabei wirst du niemals erkennen können, welche Post jemand anders bekommen hat. Schick die Nachrichten einfach an das Fenster selbst, und es sollte funktionieren. Zitieren
Guybrush Threepwood Geschrieben 10. Februar 2003 Geschrieben 10. Februar 2003 also ich hab mein thread für das fenster und die verarbeitung, oder? Genau, und der Thread für die Verarbeitung schickt die Nachricht an seinen eigenen Queue, da du ja die ThreadID per GetCurrentThreadId() geholt hast. Der Thread für das Fenster schaut aber jetzt in seinem eigenen Queue nach und da ist ja nichts drin. Also entweder schickst du die Nachricht an das Fenster anstatt den Thread, oder du besorgst dir die ThreadID von deinem Thread für das Fenster und schickst sie dahin, oder du benutzt globale Variablen. Ich seh schon, mal wieder zu langsam getippt:rolleyes: Zitieren
Leana Geschrieben 10. Februar 2003 Autor Geschrieben 10. Februar 2003 ok ich versuch das mal! mal schauen, ob ich das hin bekomme! Zitieren
Leana Geschrieben 10. Februar 2003 Autor Geschrieben 10. Februar 2003 Also ich schick das jetzt an die ThreadId vom fenster! aber er fängt das immer noch nicht auf! ich bekomm immer noch 0 zurück bei peekmessage kann mir nun einer helfen! Zitieren
Guybrush Threepwood Geschrieben 10. Februar 2003 Geschrieben 10. Februar 2003 Originally posted by Leana Also ich schick das jetzt an die ThreadId vom fenster! aber er fängt das immer noch nicht auf! Versuch doch mal anstatt PostThreadMessage(), PostMessage() und übergib als ersten Parameter dein Fensterhandle. Zitieren
Leana Geschrieben 10. Februar 2003 Autor Geschrieben 10. Februar 2003 in der msdn steht extra für sowas das man nicht postmessage nehmen soll, wenn es sich um eine thread handelt sondern postthreadmessage()!! keine ahnung was ich falsch mache!!! in der verarbeitungsklasse! PostThreadMessage(IDvonFenster, message, wparam, lparam) im fenster! PeekMessage(&msg,hWnd , WM_USER, WM_GETPROCMESS+1,PM_NOREMOVE ); Zitieren
Guybrush Threepwood Geschrieben 10. Februar 2003 Geschrieben 10. Februar 2003 wo steht das denn? ich habs nirgendwo gesehen. Aber ich hab was anderes gefunden: The thread to which the message is posted must have created a message queue, or else the call to PostThreadMessage fails. Use one of the following methods to handle this situation: -Call PostThreadMessage. If it fails, call theSleep function and call PostThreadMessage again. Repeat until PostThreadMessage succeeds. -Create an event object, then create the thread. Use theWaitForSingleObject function to wait for the event to be set to the signaled state before calling PostThreadMessage. In the thread to which the message will be posted, call PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE) to force the system to create the message queue. Set the event, to indicate that the thread is ready to receive posted messages. The thread to which the message is posted retrieves the message by calling the GetMessage or PeekMessage function. The hwnd member of the returned MSG structure is NULL. Hast du vorher so einen message queue erstellt? Probier mal als Windowhandle NULL zu übergeben. Zitieren
Leana Geschrieben 10. Februar 2003 Autor Geschrieben 10. Februar 2003 das posten funktioniert doch! da treten keine fehler auf!!!! nur mit dem peekmessage geht was schief! zu postmessage siehe msdn: PostMessage The PostMessage function places (posts) a message in the message queue associated with the thread that created the specified window and returns without waiting for the thread to process the message. To post a message in the message queue associate with a thread, use the PostThreadMessage function. aber das mit der message queue versteh ihc noch net! muss ich die selber erstellen, dachte durch erstellen des threads wird das automatisch gemacht! und es gibt ja auch keine fehler beim posten! sonst würde er ja das sagen : (msdn) GetLastError returns ERROR_INVALID_THREAD_ID if idThread is not a valid thread identifier, or if the thread specified by idThread does not have a message queue. Zitieren
Klotzkopp Geschrieben 10. Februar 2003 Geschrieben 10. Februar 2003 Originally posted by Leana keine ahnung was ich falsch mache!!! in der verarbeitungsklasse! PostThreadMessage(IDvonFenster, message, wparam, lparam) im fenster! PeekMessage(&msg,hWnd , WM_USER, WM_GETPROCMESS+1,PM_NOREMOVE ); Ganz ruhig, es gibt keinen Grund für Satzzeicheninflation. PostThreadMessage verwendet man normalerweise, um Nachrichten an einen anderen Thread zu schicken. Dadurch braucht man nämlich keine Synchronisierungsmechanismen. Dein Thread schickt Nachrichten an sich selbst. Nochmal: Du kommst an diese Nachrichten nur aus dem Thread heran, an den du sie geschickt hast. Du rufst PeekMessage aber aus dem ursprünglichen Thread heraus auf. Das hat gar nichts mit den Klassen zu tun. PostThreadMessage funktioniert übrigens nicht, wenn der Empfänger-Thread in einer modalen Schleife steckt. Wenn dein Fenster also mit DoModal angezeigt wurde (wovon ich bei einer Klasse, deren Name auf Dlg endet, ausgehe), dann geht das mit PostThreadMessage sowieso nicht, Queue hin oder her. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.