<?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[Multimedia Timer --&amp;gt; Implementierungsprobleme]]></title><description><![CDATA[<p>Hi.</p>
<p>Ich versuche in einem Thread einen Multimedia Timer zu bauen, der eine Message an diesen Thread schickt, wenn er abgelaufen ist. Allerdings scheitere ich gerade an der Implementierung.</p>
<p>Hier die momentan laufende Version:</p>
<p>.h</p>
<pre><code class="language-cpp">#include &lt;Classes.hpp&gt;
#include &lt;windows.h&gt;
#include &lt;mmSystem.h&gt;

class smDoor;
void CALLBACK TimerFunc(unsigned int timerID,unsigned int msg, DWORD dwUser, DWORD dw1, DWORD dw2);

class smDoor : public TThread
{
private:
protected:
  void __fastcall Execute();
public:
  __fastcall smDoor(bool CreateSuspended, Interfac* pinterf);
};
</code></pre>
<p>.CPP</p>
<pre><code class="language-cpp">#include &lt;vcl.h&gt;
#include &quot;Interface.h&quot;
#include &quot;smDoor.h&quot;

void __fastcall smDoor::Execute()
{
	timeSetEvent(5000,0, &amp;TimerFunc,(DWORD) this ,TIME_ONESHOT);
}

void CALLBACK TimerFunc(unsigned int timerID,unsigned int msg, DWORD dwUser, DWORD dw1, DWORD dw2)
{
	smDoor* door = (smDoor*) dwUser;
	PostThreadMessage(door-&gt;ThreadID,MSG_CLOSE,0,0);

}
</code></pre>
<p>Wie man sieht ist das Ganze momentan mit Forward DEclarations gelöst. Ich habe den Rest vom Code mal rausgeworfen.</p>
<p>Was ich möchte: Während der Ausführung des Threads soll irgendwann ein Timer angeworfen werden, der möglichst genau nach einer gewissen Zeit eine Message an den Thread feuert. Der Thread ist ein Zustandsautomat, der mit einer Message Queue arbeitet.<br />
Wenn der Timer um ist soll er sich quasi selbst die Message schicken &quot;Mach zu!&quot;. Diese Message kann auch von außen kommen.<br />
Kann ich diese Callback Funktion nicht auch als Elementfunktion der Klasse deklarieren und verwenden? Damit ich mir die this Übergabe und so spare... Also grob:</p>
<p>.h</p>
<pre><code class="language-cpp">#include &lt;Classes.hpp&gt;
#include &lt;windows.h&gt;
#include &lt;mmSystem.h&gt;

class smDoor : public TThread
{
private:
  void CALLBACK TimerFunc(unsigned int timerID,unsigned int msg, DWORD dwUser, DWORD dw1, DWORD dw2);
protected:
  void __fastcall Execute();
public:
  __fastcall smDoor(bool CreateSuspended, Interfac* pinterf);
};
</code></pre>
<p>.CPP</p>
<pre><code class="language-cpp">#include &lt;vcl.h&gt;
#include &quot;Interface.h&quot;
#include &quot;smDoor.h&quot;

void __fastcall smDoor::Execute()
{
	timeSetEvent(5000,0, &amp;TimerFunc,0,TIME_ONESHOT);
}

void CALLBACK smDoor::TimerFunc(unsigned int timerID,unsigned int msg, DWORD dwUser, DWORD dw1, DWORD dw2)
{
	PostThreadMessage(this-&gt;ThreadID,MSG_CLOSE,0,0);

}
</code></pre>
<p>Aber auf diese Art schreit mich der Compiler an.</p>
<blockquote>
<p>[C++ Fehler] smDoor.cpp(39): E2034 Konvertierung von 'void (__stdcall * (_closure )(unsigned int,unsigned int,unsigned long,unsigned long,unsigned long))(unsigned int,unsigned int,unsigned long,unsigned long,unsigned long)' nach 'void (__stdcall *)(unsigned int,unsigned int,unsigned long,unsigned long,unsigned long)' nicht möglich<br />
[C++ Fehler] smDoor.cpp(39): E2342 Keine Übereinstimmung des Typs beim Parameter 'fptc' ('void (__stdcall *)(unsigned int,unsigned int,unsigned long,unsigned long,unsigned long)' erwartet, 'void (__stdcall * (_closure )(unsigned int,unsigned int,unsigned long,unsigned long,unsigned long))(unsigned int,unsigned int,unsigned long,unsigned long,unsigned long)' erhalten)</p>
</blockquote>
<p>Leider hab ich mit Funktionszeigern und Callbacks NULL Übung....</p>
<p>Ähm... hilfe?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/180090/multimedia-timer-gt-implementierungsprobleme</link><generator>RSS for Node</generator><lastBuildDate>Thu, 09 Jul 2026 11:12:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/180090.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 28 Apr 2007 16:01:22 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Multimedia Timer --&amp;gt; Implementierungsprobleme on Sat, 28 Apr 2007 16:01:22 GMT]]></title><description><![CDATA[<p>Hi.</p>
<p>Ich versuche in einem Thread einen Multimedia Timer zu bauen, der eine Message an diesen Thread schickt, wenn er abgelaufen ist. Allerdings scheitere ich gerade an der Implementierung.</p>
<p>Hier die momentan laufende Version:</p>
<p>.h</p>
<pre><code class="language-cpp">#include &lt;Classes.hpp&gt;
#include &lt;windows.h&gt;
#include &lt;mmSystem.h&gt;

class smDoor;
void CALLBACK TimerFunc(unsigned int timerID,unsigned int msg, DWORD dwUser, DWORD dw1, DWORD dw2);

class smDoor : public TThread
{
private:
protected:
  void __fastcall Execute();
public:
  __fastcall smDoor(bool CreateSuspended, Interfac* pinterf);
};
</code></pre>
<p>.CPP</p>
<pre><code class="language-cpp">#include &lt;vcl.h&gt;
#include &quot;Interface.h&quot;
#include &quot;smDoor.h&quot;

void __fastcall smDoor::Execute()
{
	timeSetEvent(5000,0, &amp;TimerFunc,(DWORD) this ,TIME_ONESHOT);
}

void CALLBACK TimerFunc(unsigned int timerID,unsigned int msg, DWORD dwUser, DWORD dw1, DWORD dw2)
{
	smDoor* door = (smDoor*) dwUser;
	PostThreadMessage(door-&gt;ThreadID,MSG_CLOSE,0,0);

}
</code></pre>
<p>Wie man sieht ist das Ganze momentan mit Forward DEclarations gelöst. Ich habe den Rest vom Code mal rausgeworfen.</p>
<p>Was ich möchte: Während der Ausführung des Threads soll irgendwann ein Timer angeworfen werden, der möglichst genau nach einer gewissen Zeit eine Message an den Thread feuert. Der Thread ist ein Zustandsautomat, der mit einer Message Queue arbeitet.<br />
Wenn der Timer um ist soll er sich quasi selbst die Message schicken &quot;Mach zu!&quot;. Diese Message kann auch von außen kommen.<br />
Kann ich diese Callback Funktion nicht auch als Elementfunktion der Klasse deklarieren und verwenden? Damit ich mir die this Übergabe und so spare... Also grob:</p>
<p>.h</p>
<pre><code class="language-cpp">#include &lt;Classes.hpp&gt;
#include &lt;windows.h&gt;
#include &lt;mmSystem.h&gt;

class smDoor : public TThread
{
private:
  void CALLBACK TimerFunc(unsigned int timerID,unsigned int msg, DWORD dwUser, DWORD dw1, DWORD dw2);
protected:
  void __fastcall Execute();
public:
  __fastcall smDoor(bool CreateSuspended, Interfac* pinterf);
};
</code></pre>
<p>.CPP</p>
<pre><code class="language-cpp">#include &lt;vcl.h&gt;
#include &quot;Interface.h&quot;
#include &quot;smDoor.h&quot;

void __fastcall smDoor::Execute()
{
	timeSetEvent(5000,0, &amp;TimerFunc,0,TIME_ONESHOT);
}

void CALLBACK smDoor::TimerFunc(unsigned int timerID,unsigned int msg, DWORD dwUser, DWORD dw1, DWORD dw2)
{
	PostThreadMessage(this-&gt;ThreadID,MSG_CLOSE,0,0);

}
</code></pre>
<p>Aber auf diese Art schreit mich der Compiler an.</p>
<blockquote>
<p>[C++ Fehler] smDoor.cpp(39): E2034 Konvertierung von 'void (__stdcall * (_closure )(unsigned int,unsigned int,unsigned long,unsigned long,unsigned long))(unsigned int,unsigned int,unsigned long,unsigned long,unsigned long)' nach 'void (__stdcall *)(unsigned int,unsigned int,unsigned long,unsigned long,unsigned long)' nicht möglich<br />
[C++ Fehler] smDoor.cpp(39): E2342 Keine Übereinstimmung des Typs beim Parameter 'fptc' ('void (__stdcall *)(unsigned int,unsigned int,unsigned long,unsigned long,unsigned long)' erwartet, 'void (__stdcall * (_closure )(unsigned int,unsigned int,unsigned long,unsigned long,unsigned long))(unsigned int,unsigned int,unsigned long,unsigned long,unsigned long)' erhalten)</p>
</blockquote>
<p>Leider hab ich mit Funktionszeigern und Callbacks NULL Übung....</p>
<p>Ähm... hilfe?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1275257</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1275257</guid><dc:creator><![CDATA[Shogun]]></dc:creator><pubDate>Sat, 28 Apr 2007 16:01:22 GMT</pubDate></item><item><title><![CDATA[Reply to Multimedia Timer --&amp;gt; Implementierungsprobleme on Sun, 29 Apr 2007 11:10:15 GMT]]></title><description><![CDATA[<blockquote>
<p>Kann ich diese Callback Funktion nicht auch als Elementfunktion der Klasse deklarieren und verwenden?</p>
</blockquote>
<p>Ja, aber nur als static-Member-Function. Und damit klappt das auch nicht mit dem <em>this</em>.</p>
<p>Du kannst aber eine statische TimerProc so implementieren:</p>
<pre><code class="language-cpp">void CALLBACK smDoor::TimerProc(UINT uiTimerID, UINT uiMsg, DWORD dwUser, DWORD dw1, DWORD dw2)
{
   smDoor* pThis = reinterpret_cast&lt;smDoor*&gt;(dwUser);
   if(pThis != NULL)
      pThis-&gt;m_TimerProc(uiTimerID, uiMsg, dwUser, dw1, dw2);
}
</code></pre>
<p>Die private TimerProc sieht dann so aus:</p>
<pre><code class="language-cpp">void smDoor::m_TimerProc(UINT uiTimerID, UINT uiMsg, DWORD dwUser, DWORD dw1, DWORD dw2)
{
   PostThreadMessage(/*this-&gt;*/ThreadID, MSG_CLOSE, 0, 0);
}
</code></pre>
<p>Und so würde dann die Klassen-Deklaration aussehen:</p>
<pre><code class="language-cpp">class smDoor : public TThread
{
   private:
      static void CALLBACK smDoor::TimerProc(UINT uiTimerID, UINT uiMsg, DWORD dwUser, DWORD dw1, DWORD dw2);
      void m_TimerProc(UINT uiTimerID, UINT uiMsg, DWORD dwUser, DWORD dw1, DWORD dw2); // oder beide protected.
   protected:
      void Execute(void);
   public:
      smDoor(bool CreateSuspended, Interfac* pinterf);
};
</code></pre>
<p>Das Aufrufen des Timer sähe das so aus:</p>
<pre><code class="language-cpp">void smDoor::Execute(void)
{
    timeSetEvent(5000, 0, smDoor::TimerProc, reinterpret_cast&lt;DWORD&gt;(this), TIME_ONESHOT);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1275566</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1275566</guid><dc:creator><![CDATA[CodeFinder]]></dc:creator><pubDate>Sun, 29 Apr 2007 11:10:15 GMT</pubDate></item></channel></rss>