[dev-c++-mingw-winXP]Threadprog

kickerxy123

Erfahrenes Mitglied
Hallo!
Ich habe ein Problem mit der Threadprogrammierung in c++, genauer Dev-c++.(mit mingw).

Und zwar will ich einen Thread nur eine bestimmte Zeit lang ausführen und dann abbrechen:
Code:
#include <windows.h>
#include <process.h>
#include <stdio.h> 
DWORD WINAPI ThreadFunction(void *param); 
int main(){    
int param = 100;  
   HANDLE hThreadHandle = CreateThread( 0,    
                                                                                 0,   
                                      ThreadFunction, 
                                        &param,  
                                       0,    
                                     0 );   



  WaitForSingleObject(hThreadHandle,200);

  return 0;}

  DWORD WINAPI ThreadFunction(void *param){   
 int n = *(int *)param;    
    for( int i = 0; i < n; i++ )    {    
    printf("%d\n", i);    }  

     system("ping -n 1 -w 50000 1.2.3.4>nul");  
  return 0;}
ich glaube MCoder hat diesen Code vor einiger Zeit geschrieben, ich hab ihn nur wenig geändert.


So wie ich den Quelltext verstehe, sollte er den Thread für 200ms ausführen und dann abbrechen. Stattdessen führt er den system command aus und braucht 50 sekunden ...

danke im voraus und Entschuldigung für die oft erwähnte Frage über Threads.

lg
kickerxy123
 
Hallo kickerxy123,

mit Verlaub, aber dein Quellcode ist miserabel formatiert. Ich habe mir mal erlaubt, eine etwas lesbarere Version zu erstellen, damit zukünftige Leser den Quelltext schneller erfassen können:
C:
#include <windows.h>
#include <process.h>
#include <stdio.h>

DWORD WINAPI ThreadFunction(void *param);

int main() {
  int param = 100;
  HANDLE hThreadHandle = CreateThread(0,
    0,
    ThreadFunction,
    &param,
    0,
    0);
  
  WaitForSingleObject(hThreadHandle, 200);

  return 0;
}

DWORD WINAPI ThreadFunction(void *param) {
  int n = *(int *)param;
  for(int i = 0; i < n; i++) {
    printf("%d\n", i);
  }

  system("ping -n 1 -w 50000 1.2.3.4>nul");
  return 0;
}

Zu deinem eigentlichen Problem: im Quelltext steht nirgends etwas davon, dass der Thread nach 200ms abgebrochen wird. Die Funktion WaitForSingleObject wartet (sagt schon der Name) nur auf die Beendigung des Threads. Wenn du den Thread beenden willst, müsstest du zu TerminateThread greifen. Allerdings sollte man das nur in Ausnahmefällen tun (siehe verlinkte MSDN-Dokumentation).

Grüße, Matthias
 
Danke für deine Antwort!
Aber es muss doch eine Lösung geben einen Thread nur eine bestimmte Zeit lang laufen zu lassen. So wie ich das sehe, gibt es zum Beispiel in QT einen QTTimer der eben dies erfüllen kann (ich kanns sonst nochmal nachgucken).

Oder gibt es vielleicht eine ganz andere Möglichkeit...

ich möchte ein Chatprogramm entwickeln.
Eine Socketverbindung aufzubauen ist einfach, ebenso ein festes Protokoll einzurichten, also mit Startsequenz und dann Sock A und B immer abwechselnd etwas schicken zu lassen, z.B. Nur habe ich Probleme damit, dass ich als Entwickler ja nicht weiß, wer grade etwas schreiben will, denn es wird ja nicht abwechselnd sein.
Mittels select komme ich da auch nicht weiter, da er bei einer Usereingabe (hier:getline) blockiert und darauf zwingend wartet. Vielleicht könnte man das auch irgendwie ändern? Er könnte natürlich aus einer Datei einlesen, wäre aber mir nicht sauber genug.

(Ich verwende TCP Sockets

so long.... ich hoffe das ist verständlich,
mfg
kickerxy123

#edit hm getline scheint doch nicht zu blockieren ... vielleicht könntet ihr dann doch erstmal allgemein auf eine zeitbasierende Threadterminierung eingehen
 
Zurück