PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++] Problem mit AfxBeginThread()



Peter
03.03.2002, 17:20
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?

Toaster
07.03.2002, 10:55
Hi Peter,

ändere mal deinen Aufruf so ab:


::AfxBeginThread(ThreadProc, 0, THREAD_PRIORITY_NORMAL, 0, 0, NULL);

das war das erste was mir aufgefallen ist.

Gruß

Toaster

Peter
08.03.2002, 01:01
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...

Toaster
08.03.2002, 09:05
Hi Peter,

eigenartig, aber solange es funzt besser nicht darüber nachdenken ;)

Gruß

Toaster

Herbert2221
08.03.2002, 10:32
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.

Peter
08.03.2002, 14:59
Also stark vereinfacht sieht mein Code nun folgendermassen aus:
Aufruf-Methode:


BOOL CApp::InitInstance()
{
  if (...)
  {
    CMyThreads myThreads;
    myThreads.RunThreads();
  }
  else
  {
    [...]
  }
  return FALSE;
}

und die ausführende Methode:


BOOL CMyThreads::RunThreads()
{
  do
  {
    m_strApp = settings.GetCurrentTask();
    CWinThread* ptrThraedApps;
    ptrThraedApps = ::AfxBeginThread(ThreadProc, (LPVOID)ptrApp, THREAD_PRIORITY_NORMAL, 0, 0);
    [...]
  }
  while(...);
}