<?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[cout Problem]]></title><description><![CDATA[<pre><code class="language-cpp">class TimerManager{
  public:
    TimerManager();
    ~TimerManager();    // in milli secs                                 // lP ist Optional!
    void AddTimer ( int TimeToWait, void ( *Function ) ( PVOID lParam ), PVOID lParam = NULL );
  private:

    struct Timer{
      PVOID lParam; 
      double TimeToWait;
      void (*Function) ( PVOID lParam );
      double StartTime;
      explicit Timer( int TTW, void (*F)( PVOID ), PVOID lP ):TimeToWait(((double)TTW)/1000),Function(F),lParam(lP),StartTime(0){}
    };

    struct FuncThreads{
      HANDLE hThread;
      bool * bRuns;
      bool Busy;
      PVOID lParam;
      void (*Function) ( PVOID lParam );
      explicit FuncThreads ( HANDLE, void (*F)( PVOID ), PVOID lP, bool * R ):Busy(false),bRuns(R),Function(F),lParam(lP){}
    };

    std::vector &lt; Timer * &gt;Timers;
    std::vector &lt; FuncThreads * &gt; hThreads;
    HANDLE hThread;
    bool Runs;

    static DWORD WINAPI TimerThread ( PVOID lParam );
    static DWORD WINAPI FuncThread ( PVOID lParam );
};

TimerManager::TimerManager():Runs(true),hThread(NULL){
  DWORD DUMP;
  hThread = CreateThread( NULL, NULL, TimerThread, (PVOID)this, NULL, &amp;DUMP );
  // Create Idle threads.
  for ( int i = 0; i &lt; 4; i++ ){
    hThreads.push_back ( new FuncThreads( CreateThread( NULL, NULL, FuncThread, (PVOID)NULL, CREATE_SUSPENDED, &amp;DUMP ),
                                          NULL,
                                          NULL,
                                          &amp;Runs ) );
  }
}

TimerManager::~TimerManager(){
  Runs = false;
  if ( hThread != NULL ){
    DWORD ExitCode;
    GetExitCodeThread(hThread,&amp;ExitCode);
    TerminateThread(hThread,ExitCode);
  }
  for ( std::vector &lt; FuncThreads * &gt;::iterator It = hThreads.begin(); It &lt; hThreads.end(); It++ ){
    DWORD ExitCode;
    GetExitCodeThread((*It)-&gt;hThread,&amp;ExitCode);
    TerminateThread((*It)-&gt;hThread,ExitCode);
    delete *It;
  }
  for ( std::vector &lt; Timer * &gt;::iterator It = Timers.begin(); It &lt; Timers.end(); It++ )
    delete *It;

}
void TimerManager::AddTimer ( int TimeToWait, void ( *Function ) ( PVOID ), PVOID lParam ){
  Timers.push_back(new Timer(TimeToWait,Function,lParam));
}

DWORD WINAPI TimerManager::TimerThread ( PVOID lParam ){
  TimerManager * Object = reinterpret_cast &lt; TimerManager* &gt;(lParam);
  __int64 Frequency, CurrentCount;
  double CurrPos;
  if (!QueryPerformanceFrequency((LARGE_INTEGER*)&amp;Frequency))
    return 0;
  while ( Object-&gt;Runs ){
    QueryPerformanceCounter((LARGE_INTEGER*)&amp;CurrentCount);
    CurrPos = CurrentCount / (double)Frequency;
    for ( std::vector &lt; Timer * &gt;::iterator tIt = Object-&gt;Timers.begin(); tIt &lt; Object-&gt;Timers.end(); tIt++ ){
      if ( !(*tIt)-&gt;StartTime ){
        (*tIt)-&gt;StartTime = CurrPos;
        continue;
      }
       if ( (( CurrPos - (*tIt)-&gt;StartTime )) &gt;= (*tIt)-&gt;TimeToWait ){
        if ( (*tIt)-&gt;Function ){
          bool Found = false;
          for ( std::vector &lt; FuncThreads * &gt;::iterator fIt = Object-&gt;hThreads.begin(); fIt &lt; Object-&gt;hThreads.end(); fIt++ ){
            if ( (*fIt)-&gt;Busy )continue;
            (*fIt)-&gt;Function = (*tIt)-&gt;Function;
            (*fIt)-&gt;lParam = (*tIt)-&gt;lParam;
            (*fIt)-&gt;Busy = true;
            ResumeThread((*fIt)-&gt;hThread);
            Found = true;
          }
          if ( !Found ){
            DWORD DUMP;
            // Arbeite wenn busy...
            FuncThreads * ftTemp = new FuncThreads(NULL,(*tIt)-&gt;Function,(*tIt)-&gt;lParam,&amp;(Object-&gt;Runs));
            HANDLE hTemp = CreateThread( NULL, NULL, FuncThread, (PVOID)ftTemp, NULL, &amp;DUMP );
            ftTemp-&gt;hThread = hTemp;
            ftTemp-&gt;Busy = true;
            Object-&gt;hThreads.push_back(ftTemp);
            ResumeThread(hTemp);
          }

          //(*It)-&gt;Function((*It)-&gt;lParam);
        }
        (*tIt)-&gt;StartTime = 0;
      }
    }
  }
  return 0;
}

DWORD WINAPI TimerManager::FuncThread ( PVOID lParam ){
  FuncThreads * Object = reinterpret_cast &lt; FuncThreads * &gt;(lParam);
  while ( *(Object-&gt;bRuns) ){
    if ( Object-&gt;Busy ){
      Object-&gt;Function( Object-&gt;lParam );
      Object-&gt;Function = NULL;
      Object-&gt;lParam = NULL;
      Object-&gt;Busy = false;
      SuspendThread(GetCurrentThread());
    }
  }
  return 0;
}
</code></pre>
<p>ausprobier anwendung xD</p>
<pre><code class="language-cpp">int M = 0,S = 0, MS = 0;

void Increase( PVOID lParam  ){
 MS += 100;
 if ( MS &gt;= 1000 ){
  MS = 0;
  if ( ++S &gt;= 60 ){
    S = 0;
    M++;
  }
 }
}

void Output( PVOID lParam ){

  //cout &lt;&lt; &quot;Time: M,S,MS &quot; &lt;&lt; M &lt;&lt; &quot; : &quot; &lt;&lt; S &lt;&lt; &quot; : &quot; &lt;&lt; MS &lt;&lt; endl;
  return;
}

int main(int argc, char* argv[])
{

  TimerManager * Man = new TimerManager();

  Man-&gt;AddTimer(100,Increase);
  Man-&gt;AddTimer(3000,Output);

  //Man-&gt;AddTimer(3000,MeineKlasse-&gt;TimerProcc,(PVOID)MeineKlasse);

  Sleep(1212000);
  delete Man;
  return 0;
}
//---------------------------------------------------------------------------
</code></pre>
<p>Hi,</p>
<p>also habe gerade das problem das wenn ich den timer so schreibe wie er im moment ist, er warsch. durch den aufruf aus anderen threads probleme mit der konsolen ausgabe kriegt, kann ich dies durch eine explizite zuweisung des konsolen handles zu cout wieder beheben, und wenn, wie gehts sowas :D?</p>
<p>edit --</p>
<p>hat sich erledigt, der fehler lag in zeile 90, break vergessen <sup>.</sup></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/244050/cout-problem</link><generator>RSS for Node</generator><lastBuildDate>Sat, 19 Sep 2026 14:41:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/244050.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 24 Jun 2009 14:11:15 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to cout Problem on Wed, 24 Jun 2009 14:42:49 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class TimerManager{
  public:
    TimerManager();
    ~TimerManager();    // in milli secs                                 // lP ist Optional!
    void AddTimer ( int TimeToWait, void ( *Function ) ( PVOID lParam ), PVOID lParam = NULL );
  private:

    struct Timer{
      PVOID lParam; 
      double TimeToWait;
      void (*Function) ( PVOID lParam );
      double StartTime;
      explicit Timer( int TTW, void (*F)( PVOID ), PVOID lP ):TimeToWait(((double)TTW)/1000),Function(F),lParam(lP),StartTime(0){}
    };

    struct FuncThreads{
      HANDLE hThread;
      bool * bRuns;
      bool Busy;
      PVOID lParam;
      void (*Function) ( PVOID lParam );
      explicit FuncThreads ( HANDLE, void (*F)( PVOID ), PVOID lP, bool * R ):Busy(false),bRuns(R),Function(F),lParam(lP){}
    };

    std::vector &lt; Timer * &gt;Timers;
    std::vector &lt; FuncThreads * &gt; hThreads;
    HANDLE hThread;
    bool Runs;

    static DWORD WINAPI TimerThread ( PVOID lParam );
    static DWORD WINAPI FuncThread ( PVOID lParam );
};

TimerManager::TimerManager():Runs(true),hThread(NULL){
  DWORD DUMP;
  hThread = CreateThread( NULL, NULL, TimerThread, (PVOID)this, NULL, &amp;DUMP );
  // Create Idle threads.
  for ( int i = 0; i &lt; 4; i++ ){
    hThreads.push_back ( new FuncThreads( CreateThread( NULL, NULL, FuncThread, (PVOID)NULL, CREATE_SUSPENDED, &amp;DUMP ),
                                          NULL,
                                          NULL,
                                          &amp;Runs ) );
  }
}

TimerManager::~TimerManager(){
  Runs = false;
  if ( hThread != NULL ){
    DWORD ExitCode;
    GetExitCodeThread(hThread,&amp;ExitCode);
    TerminateThread(hThread,ExitCode);
  }
  for ( std::vector &lt; FuncThreads * &gt;::iterator It = hThreads.begin(); It &lt; hThreads.end(); It++ ){
    DWORD ExitCode;
    GetExitCodeThread((*It)-&gt;hThread,&amp;ExitCode);
    TerminateThread((*It)-&gt;hThread,ExitCode);
    delete *It;
  }
  for ( std::vector &lt; Timer * &gt;::iterator It = Timers.begin(); It &lt; Timers.end(); It++ )
    delete *It;

}
void TimerManager::AddTimer ( int TimeToWait, void ( *Function ) ( PVOID ), PVOID lParam ){
  Timers.push_back(new Timer(TimeToWait,Function,lParam));
}

DWORD WINAPI TimerManager::TimerThread ( PVOID lParam ){
  TimerManager * Object = reinterpret_cast &lt; TimerManager* &gt;(lParam);
  __int64 Frequency, CurrentCount;
  double CurrPos;
  if (!QueryPerformanceFrequency((LARGE_INTEGER*)&amp;Frequency))
    return 0;
  while ( Object-&gt;Runs ){
    QueryPerformanceCounter((LARGE_INTEGER*)&amp;CurrentCount);
    CurrPos = CurrentCount / (double)Frequency;
    for ( std::vector &lt; Timer * &gt;::iterator tIt = Object-&gt;Timers.begin(); tIt &lt; Object-&gt;Timers.end(); tIt++ ){
      if ( !(*tIt)-&gt;StartTime ){
        (*tIt)-&gt;StartTime = CurrPos;
        continue;
      }
       if ( (( CurrPos - (*tIt)-&gt;StartTime )) &gt;= (*tIt)-&gt;TimeToWait ){
        if ( (*tIt)-&gt;Function ){
          bool Found = false;
          for ( std::vector &lt; FuncThreads * &gt;::iterator fIt = Object-&gt;hThreads.begin(); fIt &lt; Object-&gt;hThreads.end(); fIt++ ){
            if ( (*fIt)-&gt;Busy )continue;
            (*fIt)-&gt;Function = (*tIt)-&gt;Function;
            (*fIt)-&gt;lParam = (*tIt)-&gt;lParam;
            (*fIt)-&gt;Busy = true;
            ResumeThread((*fIt)-&gt;hThread);
            Found = true;
          }
          if ( !Found ){
            DWORD DUMP;
            // Arbeite wenn busy...
            FuncThreads * ftTemp = new FuncThreads(NULL,(*tIt)-&gt;Function,(*tIt)-&gt;lParam,&amp;(Object-&gt;Runs));
            HANDLE hTemp = CreateThread( NULL, NULL, FuncThread, (PVOID)ftTemp, NULL, &amp;DUMP );
            ftTemp-&gt;hThread = hTemp;
            ftTemp-&gt;Busy = true;
            Object-&gt;hThreads.push_back(ftTemp);
            ResumeThread(hTemp);
          }

          //(*It)-&gt;Function((*It)-&gt;lParam);
        }
        (*tIt)-&gt;StartTime = 0;
      }
    }
  }
  return 0;
}

DWORD WINAPI TimerManager::FuncThread ( PVOID lParam ){
  FuncThreads * Object = reinterpret_cast &lt; FuncThreads * &gt;(lParam);
  while ( *(Object-&gt;bRuns) ){
    if ( Object-&gt;Busy ){
      Object-&gt;Function( Object-&gt;lParam );
      Object-&gt;Function = NULL;
      Object-&gt;lParam = NULL;
      Object-&gt;Busy = false;
      SuspendThread(GetCurrentThread());
    }
  }
  return 0;
}
</code></pre>
<p>ausprobier anwendung xD</p>
<pre><code class="language-cpp">int M = 0,S = 0, MS = 0;

void Increase( PVOID lParam  ){
 MS += 100;
 if ( MS &gt;= 1000 ){
  MS = 0;
  if ( ++S &gt;= 60 ){
    S = 0;
    M++;
  }
 }
}

void Output( PVOID lParam ){

  //cout &lt;&lt; &quot;Time: M,S,MS &quot; &lt;&lt; M &lt;&lt; &quot; : &quot; &lt;&lt; S &lt;&lt; &quot; : &quot; &lt;&lt; MS &lt;&lt; endl;
  return;
}

int main(int argc, char* argv[])
{

  TimerManager * Man = new TimerManager();

  Man-&gt;AddTimer(100,Increase);
  Man-&gt;AddTimer(3000,Output);

  //Man-&gt;AddTimer(3000,MeineKlasse-&gt;TimerProcc,(PVOID)MeineKlasse);

  Sleep(1212000);
  delete Man;
  return 0;
}
//---------------------------------------------------------------------------
</code></pre>
<p>Hi,</p>
<p>also habe gerade das problem das wenn ich den timer so schreibe wie er im moment ist, er warsch. durch den aufruf aus anderen threads probleme mit der konsolen ausgabe kriegt, kann ich dies durch eine explizite zuweisung des konsolen handles zu cout wieder beheben, und wenn, wie gehts sowas :D?</p>
<p>edit --</p>
<p>hat sich erledigt, der fehler lag in zeile 90, break vergessen <sup>.</sup></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1732162</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1732162</guid><dc:creator><![CDATA[Schurke]]></dc:creator><pubDate>Wed, 24 Jun 2009 14:42:49 GMT</pubDate></item></channel></rss>