Zum Inhalt springen

PostThreadMessage


Leana

Empfohlene Beiträge

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:

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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)!!!

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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. :(

Link zu diesem Kommentar
Auf anderen Seiten teilen

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:

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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:

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 );

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...