[C++] Problem mit AfxBeginThread()

Peter

Lt. Commander
Registriert
Mai 2001
Beiträge
1.957
Problem mit AfxBeginThread()

Code:
CThreadingApp theApp;

UINT ThreadProc(LPVOID lpP)
{
	::Sleep(....);
	::ShellExecute(....);
	return 0;
}

BOOL CThreadingApp::InitInstance()
{
	::AfxBeginThread(ThreadProc, 0, THREAD_PRIORITY_NORMAL, 0, 0);
	return FALSE;
}
Der Compiler liefert keine Fehler. Auch der return-Wert von AfxBeginThread ist nicht NULL. Ausführen lässt sich die Applikation auch, aber so wie es aussieht wird ThreadProc vor dem ersten Funktionsaufruf, also Sleep() beendet. Kann es sein, dass es nicht möglich ist, einen thread schon in der
InitInstance()-Mehode zu erzeugen?
 
Daran liegts auch nicht...

Ich habe bisher noch nie die Parameter für Sicherheitsattributen angegeben.

Mittlerweile hab ich einen workaround für dieses seltsame Problem gefunden:
Dort wo die Threads gestartert werden sollen, wird eine extra Klasse aufgrufen, welche nur für die Threads zuständig ist. Und seltsamerweise funzt mein Code, so wie ich ihn hatte, dort problemlos...
 
Also, soweit ich das mit den Threads in VC++ verstanden habe, sind das auch POSIX ähnliche Threads.

Und deshalb muss es so sein, dass man für Threads eine eigene Klasse und dann für jeden Thread ein eigenes Objekt hat.

Wenn du einen Thread mit einer Funktion startest, die im Hauptobjekt ist (sag ich jetzt mal so, als wäre es wie in Java), also global. Dann kann es nicht funktionieren. Schliesslich "macht" man quasi das gesamte Objekt zum Thread. Nicht nur die Funktion. Also wäre das gesamte Programm nun ein Thread.
Das kann so nicht funktionieren..

Ihr merkt schon, dass ich das nicht so 100% verstanden habe. Aber unter UNIX ist es ganz genau so.. Man braucht eine Klasse pro Thread-Typ und ein Objekt pro Thread.
 
Also stark vereinfacht sieht mein Code nun folgendermassen aus:
Aufruf-Methode:
Code:
BOOL CApp::InitInstance()
{
  if (...)
  {
    CMyThreads myThreads;
    myThreads.RunThreads();
  }
  else
  {
    [...]
  }
  return FALSE;
}
und die ausführende Methode:
Code:
BOOL CMyThreads::RunThreads()
{
  do 
  { 
    m_strApp = settings.GetCurrentTask();
    CWinThread* ptrThraedApps;
    ptrThraedApps = ::AfxBeginThread(ThreadProc, (LPVOID)ptrApp, THREAD_PRIORITY_NORMAL, 0, 0);
    [...]
  }
  while(...);
}
 
Zuletzt bearbeitet:
Zurück
Oben