<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Threadsynchronisierung]]></title><description><![CDATA[<p>Hi,</p>
<p>könnte mir jemand helfen.</p>
<p>habe folgendes Problem:</p>
<p>Ein hauptddialog startet einen Workerthread. Dieser soll bei einem bestimmten Wert eine Nachricht an den Hauptdialog senden und dabei mit Waitforsingelobjekt pausieren bis der Haupdialog den Workerthread wieder aufweckt.d.h Während Worker pausiert gibt Hauptdialog den übergebenen Wert aus und weckt anschliessend den Worker</p>
<p>Klappt aber irgendwie nicht. Kann meine selbstdefinierte Onmymessage nicht aufrufen. Bzw. die Meldung der eigenen nachrichtenbehanldungsmethode erscheint nicht auf dem Debugfenster.</p>
<p>Wo ist der Fehler ?</p>
<p>.h</p>
<p>// Inside_visual_eigene_NachrichtDlg.h : Headerdatei<br />
//</p>
<p>#pragma once</p>
<p>// CInside_visual_eigene_NachrichtDlg Dialogfeld<br />
class CInside_visual_eigene_NachrichtDlg : public CDialog<br />
{<br />
// Konstruktion<br />
public:<br />
CInside_visual_eigene_NachrichtDlg(CWnd* pParent = NULL); // Standardkonstruktor</p>
<p>// Dialogfelddaten<br />
enum { IDD = IDD_INSIDE_VISUAL_EIGENE_NACHRICHT_DIALOG };</p>
<p>protected:<br />
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV-Unterstützung</p>
<p>// Implementierung<br />
protected:<br />
HICON m_hIcon;<br />
CWnd * pWnd;<br />
HANDLE *hWnd;</p>
<p>// Generierte Funktionen für die Meldungstabellen<br />
virtual BOOL OnInitDialog();<br />
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);<br />
afx_msg void OnPaint();<br />
afx_msg HCURSOR OnQueryDragIcon();<br />
--------------1. Im Header der Empfängerklasse den Msghandler deklariert--------<br />
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);<br />
DECLARE_MESSAGE_MAP()<br />
public:<br />
afx_msg void OnBnClickedButton1();<br />
int m_ausgabe;<br />
afx_msg void OnBnClickedButton4();</p>
<p>};</p>
<p>.cpp</p>
<p>.cpp</p>
<p>#include &quot;stdafx.h&quot;<br />
#include &quot;Inside_visual_eigene_Nachricht.h&quot;<br />
#include &quot;Inside_visual_eigene_NachrichtDlg.h&quot;<br />
#include &quot;.\inside_visual_eigene_nachrichtdlg.h&quot;<br />
#include &quot;afxmt.h&quot; // Wichtig für CEvent klasse</p>
<p>#ifdef _DEBUG<br />
#define new DEBUG_NEW<br />
#endif</p>
<p>-------------------------------2. Message definieren---------------------------<br />
#define WM_THREADFINISHED WM_USER+1</p>
<p>--------------------------------3.Workerthread prototyp<br />
UINT Workerthread(LPVOID pParam);</p>
<p>------------------------------4. Events prototyp<br />
CEvent g_eventContinue; //erzeugt event mit automatisch</p>
<p>// CInside_visual_eigene_NachrichtDlg Dialogfeld</p>
<p>CInside_visual_eigene_NachrichtDlg::CInside_visual_eigene_NachrichtDlg(CWnd* pParent /<em>=NULL</em>/)<br />
: CDialog(CInside_visual_eigene_NachrichtDlg::IDD, pParent)<br />
, m_ausgabe(0)<br />
{<br />
m_hIcon = AfxGetApp()-&gt;LoadIcon(IDR_MAINFRAME);<br />
}</p>
<p>void CInside_visual_eigene_NachrichtDlg::DoDataExchange(CDataExchange* pDX)<br />
{<br />
CDialog::DoDataExchange(pDX);<br />
DDX_Text(pDX, IDC_AUSGABE, m_ausgabe);<br />
}</p>
<p>BEGIN_MESSAGE_MAP(CInside_visual_eigene_NachrichtDlg, CDialog)<br />
ON_WM_SYSCOMMAND()<br />
ON_WM_PAINT()<br />
ON_WM_QUERYDRAGICON()<br />
//}}AFX_MSG_MAP<br />
ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1)</p>
<p>---------------------------------5. in cpp file empfängerklasseliste ergänzen<br />
ON_MESSAGE(WM_THREADFINISHED,OnMyMessage)<br />
ON_BN_CLICKED(IDC_BUTTON4, OnBnClickedButton4)<br />
END_MESSAGE_MAP()</p>
<p>//Button 1 soll workerthread aktivieren<br />
void CInside_visual_eigene_NachrichtDlg::OnBnClickedButton1()<br />
{</p>
<p>int hwnd =GetDlgCtrlID();</p>
<p>------------------ -------------- 6. Starte Workerthread übergebe Handler auf Dlg<br />
CWinThread * pThread = AfxBeginThread(Workerthread,&amp;hwnd);</p>
<p>}</p>
<p>UINT Workerthread(LPVOID pParam){</p>
<p>CWnd* pWindow= (CWnd*) pParam;</p>
<p>TRACE(&quot;HIER IN WORKERTHREAD , WARTE AUF EREIGNIS \n\n\n&quot;);<br />
TRACE(&quot;\nDIE BERECHNUNG WIRD GESTARTET&quot;);<br />
for(int count=0;count&lt;100;count++){<br />
TRACE(&quot;Hier im workerthread %i \n&quot;,count);<br />
if(count==50) {<br />
TRACE(&quot;Hier count = 50, Nachricht wird versendet\n&quot;);<br />
::PostMessage((HWND)pParam,WM_THREADFINISHED,(WPARAM)count,0);<br />
::WaitForSingleObject(g_eventContinue,INFINITE);<br />
}<br />
}<br />
return 0;</p>
<p>}</p>
<p>//Diese Methode sollte die Nachricht vom Workerthread empfangen und Zwischenergebniss im Fenster des Hauptdialoges ausgeben ,anschliessend soll der Workerthread weiterlaufen</p>
<p>LRESULT CInside_visual_eigene_NachrichtDlg::OnMyMessage(WPARAM wParam, LPARAM lParam){<br />
TRACE(&quot;!!!!!!!!!!!!!!!!!!!!!!!!!!!!Nachricht erhalten!!!!!!!%i!!!!!!!!!!!!!!!!!!!!!!!!\n&quot;);<br />
g_eventContinue.SetEvent(); //Workerthread soll weitermachen<br />
return 0;</p>
<p>}</p>
<p>OnMyMessage wird aber nicht ausgeführt, Weiss jemand vielleicht warum ?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/152864/threadsynchronisierung</link><generator>RSS for Node</generator><lastBuildDate>Thu, 23 Jul 2026 22:33:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/152864.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 10 Jul 2006 15:43:45 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Threadsynchronisierung on Mon, 10 Jul 2006 15:43:45 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>könnte mir jemand helfen.</p>
<p>habe folgendes Problem:</p>
<p>Ein hauptddialog startet einen Workerthread. Dieser soll bei einem bestimmten Wert eine Nachricht an den Hauptdialog senden und dabei mit Waitforsingelobjekt pausieren bis der Haupdialog den Workerthread wieder aufweckt.d.h Während Worker pausiert gibt Hauptdialog den übergebenen Wert aus und weckt anschliessend den Worker</p>
<p>Klappt aber irgendwie nicht. Kann meine selbstdefinierte Onmymessage nicht aufrufen. Bzw. die Meldung der eigenen nachrichtenbehanldungsmethode erscheint nicht auf dem Debugfenster.</p>
<p>Wo ist der Fehler ?</p>
<p>.h</p>
<p>// Inside_visual_eigene_NachrichtDlg.h : Headerdatei<br />
//</p>
<p>#pragma once</p>
<p>// CInside_visual_eigene_NachrichtDlg Dialogfeld<br />
class CInside_visual_eigene_NachrichtDlg : public CDialog<br />
{<br />
// Konstruktion<br />
public:<br />
CInside_visual_eigene_NachrichtDlg(CWnd* pParent = NULL); // Standardkonstruktor</p>
<p>// Dialogfelddaten<br />
enum { IDD = IDD_INSIDE_VISUAL_EIGENE_NACHRICHT_DIALOG };</p>
<p>protected:<br />
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV-Unterstützung</p>
<p>// Implementierung<br />
protected:<br />
HICON m_hIcon;<br />
CWnd * pWnd;<br />
HANDLE *hWnd;</p>
<p>// Generierte Funktionen für die Meldungstabellen<br />
virtual BOOL OnInitDialog();<br />
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);<br />
afx_msg void OnPaint();<br />
afx_msg HCURSOR OnQueryDragIcon();<br />
--------------1. Im Header der Empfängerklasse den Msghandler deklariert--------<br />
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);<br />
DECLARE_MESSAGE_MAP()<br />
public:<br />
afx_msg void OnBnClickedButton1();<br />
int m_ausgabe;<br />
afx_msg void OnBnClickedButton4();</p>
<p>};</p>
<p>.cpp</p>
<p>.cpp</p>
<p>#include &quot;stdafx.h&quot;<br />
#include &quot;Inside_visual_eigene_Nachricht.h&quot;<br />
#include &quot;Inside_visual_eigene_NachrichtDlg.h&quot;<br />
#include &quot;.\inside_visual_eigene_nachrichtdlg.h&quot;<br />
#include &quot;afxmt.h&quot; // Wichtig für CEvent klasse</p>
<p>#ifdef _DEBUG<br />
#define new DEBUG_NEW<br />
#endif</p>
<p>-------------------------------2. Message definieren---------------------------<br />
#define WM_THREADFINISHED WM_USER+1</p>
<p>--------------------------------3.Workerthread prototyp<br />
UINT Workerthread(LPVOID pParam);</p>
<p>------------------------------4. Events prototyp<br />
CEvent g_eventContinue; //erzeugt event mit automatisch</p>
<p>// CInside_visual_eigene_NachrichtDlg Dialogfeld</p>
<p>CInside_visual_eigene_NachrichtDlg::CInside_visual_eigene_NachrichtDlg(CWnd* pParent /<em>=NULL</em>/)<br />
: CDialog(CInside_visual_eigene_NachrichtDlg::IDD, pParent)<br />
, m_ausgabe(0)<br />
{<br />
m_hIcon = AfxGetApp()-&gt;LoadIcon(IDR_MAINFRAME);<br />
}</p>
<p>void CInside_visual_eigene_NachrichtDlg::DoDataExchange(CDataExchange* pDX)<br />
{<br />
CDialog::DoDataExchange(pDX);<br />
DDX_Text(pDX, IDC_AUSGABE, m_ausgabe);<br />
}</p>
<p>BEGIN_MESSAGE_MAP(CInside_visual_eigene_NachrichtDlg, CDialog)<br />
ON_WM_SYSCOMMAND()<br />
ON_WM_PAINT()<br />
ON_WM_QUERYDRAGICON()<br />
//}}AFX_MSG_MAP<br />
ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1)</p>
<p>---------------------------------5. in cpp file empfängerklasseliste ergänzen<br />
ON_MESSAGE(WM_THREADFINISHED,OnMyMessage)<br />
ON_BN_CLICKED(IDC_BUTTON4, OnBnClickedButton4)<br />
END_MESSAGE_MAP()</p>
<p>//Button 1 soll workerthread aktivieren<br />
void CInside_visual_eigene_NachrichtDlg::OnBnClickedButton1()<br />
{</p>
<p>int hwnd =GetDlgCtrlID();</p>
<p>------------------ -------------- 6. Starte Workerthread übergebe Handler auf Dlg<br />
CWinThread * pThread = AfxBeginThread(Workerthread,&amp;hwnd);</p>
<p>}</p>
<p>UINT Workerthread(LPVOID pParam){</p>
<p>CWnd* pWindow= (CWnd*) pParam;</p>
<p>TRACE(&quot;HIER IN WORKERTHREAD , WARTE AUF EREIGNIS \n\n\n&quot;);<br />
TRACE(&quot;\nDIE BERECHNUNG WIRD GESTARTET&quot;);<br />
for(int count=0;count&lt;100;count++){<br />
TRACE(&quot;Hier im workerthread %i \n&quot;,count);<br />
if(count==50) {<br />
TRACE(&quot;Hier count = 50, Nachricht wird versendet\n&quot;);<br />
::PostMessage((HWND)pParam,WM_THREADFINISHED,(WPARAM)count,0);<br />
::WaitForSingleObject(g_eventContinue,INFINITE);<br />
}<br />
}<br />
return 0;</p>
<p>}</p>
<p>//Diese Methode sollte die Nachricht vom Workerthread empfangen und Zwischenergebniss im Fenster des Hauptdialoges ausgeben ,anschliessend soll der Workerthread weiterlaufen</p>
<p>LRESULT CInside_visual_eigene_NachrichtDlg::OnMyMessage(WPARAM wParam, LPARAM lParam){<br />
TRACE(&quot;!!!!!!!!!!!!!!!!!!!!!!!!!!!!Nachricht erhalten!!!!!!!%i!!!!!!!!!!!!!!!!!!!!!!!!\n&quot;);<br />
g_eventContinue.SetEvent(); //Workerthread soll weitermachen<br />
return 0;</p>
<p>}</p>
<p>OnMyMessage wird aber nicht ausgeführt, Weiss jemand vielleicht warum ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1095251</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1095251</guid><dc:creator><![CDATA[django]]></dc:creator><pubDate>Mon, 10 Jul 2006 15:43:45 GMT</pubDate></item><item><title><![CDATA[Reply to Threadsynchronisierung on Mon, 10 Jul 2006 15:50:23 GMT]]></title><description><![CDATA[<p>Der cast von pParam einmal auf CWnd* und weiter unten auf HWND ist nicht konsistent (in der ThreadFunc).<br />
Aber das nur auf den ersten Blick <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>...</p>
<p>Edit: d.h. ich guck mal noch ein bisschen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1095258</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1095258</guid><dc:creator><![CDATA[connan]]></dc:creator><pubDate>Mon, 10 Jul 2006 15:50:23 GMT</pubDate></item><item><title><![CDATA[Reply to Threadsynchronisierung on Mon, 10 Jul 2006 15:53:02 GMT]]></title><description><![CDATA[<p>Ich finde es immer wieder schön, wie die Leute Funktionen benutzen ohne eine Ahnung zu haben, was diese Funktion eigentlich überhaupt tut. Und sogar, wenn dann alles nicht übereinstimmt in der Funktion die Rückgabewerte und so weiter nicht stimmen, dann wird halt einfach gemorgst.</p>
<p>GetDlgCtrlID() liefert dir die ID zurück und kein HWND. Um an das HWND zu kommen musst du GetSafeHwnd() aufrufen. Zudem ist HWND ungleich einem Zeiger auf CWnd.</p>
<p>Ob sonst noch was falsch ist weiss ich nicht. Solange keine CPP-Tags hinsetzt werde ich auch nicht schauen.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1095262</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1095262</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Mon, 10 Jul 2006 15:53:02 GMT</pubDate></item><item><title><![CDATA[Reply to Threadsynchronisierung on Mon, 10 Jul 2006 15:58:53 GMT]]></title><description><![CDATA[<p>Kann es sein, dass GetDlgCtrlId nicht den HWND liefert? Versuchs doch mal mit CWnd::GetSafeHwnd().<br />
Also :</p>
<pre><code class="language-cpp">int hwnd = this-&gt;GetSafeHwnd() //obwohl mir das mit dem int nich ganz geheuer ist
</code></pre>
<p>nochmal zu dem int, warum nimmst du nicht HWND?</p>
<p>edit: too late <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1095263</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1095263</guid><dc:creator><![CDATA[connan]]></dc:creator><pubDate>Mon, 10 Jul 2006 15:58:53 GMT</pubDate></item><item><title><![CDATA[Reply to Threadsynchronisierung on Tue, 11 Jul 2006 07:35:22 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>habe das Problem gelöst.</p>
<p>1. AfxBeginThread(Workerthread,(LPVOID)this-&gt;m_hWnd)</p>
<p>this-&gt;m_hWnd ist ein vordefinierter Zeiger auf das Hauptfenster</p>
<p>2. Postmessage((HWND)pParam,WM_Threadfinished,0,0);</p>
<p>Dann läuft das Ganze auch</p>
<p>vielen Dank Jungs <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1095558</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1095558</guid><dc:creator><![CDATA[django]]></dc:creator><pubDate>Tue, 11 Jul 2006 07:35:22 GMT</pubDate></item></channel></rss>