News... | Hack-Acad | Downloads | Web-Projekte | Kontakt
HACKACAD - Create Thread

Durchaus Sinnvoll bei einigen Anwendungen die Aufgaben auf verschiedene "Threads" aufzuteilen. Das Hauptprogramm kann angeleitet werden um auf die Abarbeitung aller Threads zu warten, bzw. kann einen Zeitwert vorgeben, der die maximale Bearbeitungszeit in Millisekunden vorgibt.

In diesem erweiterten Beispiel einer anderen Quelle werden 3 Threads generiert. Jeder Thread meldet sich bei Beginn und Ende seiner Tätigkeit. Thread2 wird etwas länger brauchen, da er auf das bereits besprochene "InternetOpen" Beispiel zugreift. Thread3 wird starten und in einer Endlos-Schleife verharren. Thread4 zählt nur einfach einen Zähler hoch. Anhand der Meldungen kann man sehen das die Threads in Reihenfolge gestartet werden, aber in anderer Reihenfolge fertig sind. Thread3 wird nicht vor Ablauf des 10 Sekunden Zeitlimits fertig... ab da übernimmt wieder das Hauptprogramm.

 
 #include <windows.h> 
 #include <wininet.h>
 #include <stdio.h>

 #pragma comment(lib, "Ws2_32.lib")
 #pragma comment(lib, "wininet.lib")


 //Header declarations
 long WINAPI Thread2(long lParam);
 long WINAPI Thread3(long lParam);
 long WINAPI Thread4(long lParam);


 int main(void)
 {
   HANDLE hThread[3];
   DWORD dwID[3];
   DWORD dwRetVal = 0;
   int i;
   
   printf("\r\nNow creating threads...\r\n");  

   hThread[0] = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread2,NULL,0,&dwID[0]); 
   hThread[1] = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread3,NULL,0,&dwID[1]); 
   hThread[2] = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread4,NULL,0,&dwID[2]); 
   
   printf("\r\nMain thread responding... Threads created!\r\n");
  
   //Threads habe 10 Sekunden Zeit um Ihre Aufgabe zu erfüllen,
   //danach wird abgebrochen... soll auf ALLE Threads gewartet werde
   //setzt man das Zeitlimit (10000) auf INFINITE
   dwRetVal = WaitForMultipleObjects(3, hThread, TRUE, 10000);
  
   printf("\r\nAll threads have completed...\r\n");
    
   for (i = 0; i < 3; i++)
   CloseHandle(hThread[i]);
   
   printf("\r\nMain thread finished...\r\n");
  
   return 0;
 }

 long WINAPI Thread2(long lParam)
 {
   HINTERNET hInet, hUrl;
   DWORD     dwCode, dwLen;
   CHAR      cData[256];

   printf("\r\nThread2 responding... attempting InternetOpen\r\n");
	
   if(NULL == (hInet = InternetOpen(TEXT("InetURL:/1.0"),INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0)))
      printf("Unsuccessful InternetOpen\r\n");
   else
   {
      printf("\r\nSuccessful InternetOpen von Thread2\r\n");

      if(NULL != (hUrl = InternetOpenUrl(hInet, "http://www.slaughterarts.de",
         NULL, 0, INTERNET_FLAG_RELOAD, 0)))
      {
         dwCode = 0;
         dwLen  = sizeof(dwCode);

         HttpQueryInfo(hUrl, HTTP_QUERY_STATUS_CODE, &dwCode, &dwLen, 0);
         if((dwCode == '002') || (dwCode == '203'))
         {
            if(InternetReadFile(hUrl, cData, 256, &dwLen))
            {
               cData[255] = '\0';
               printf("%s\n", strtok(cData, ""));
            }
         }
         InternetCloseHandle(hUrl);
      }
      else
      printf ("Apparently no valid url!\r\n");
   }

   InternetCloseHandle(hInet);
	 
   printf("\r\nThread2 finished...\r\n");
	
   return 0;
 }

 long WINAPI Thread3(long lParam)
 {
  
   float i = 0;
   printf("\r\nThread3 responding...\r\n");

   while ()
   { /* DOOMED */	}

   printf("\r\nThread3 finished...\r\n");

   return 0;
 }

 long WINAPI Thread4(long lParam)
 {  
   int i = 0;	
	
   printf("\r\nThread4 responding...\r\n");

   while (i < 10000)
   { i++; }

   printf("\r\nThread4 finished...\r\n");
   
   return 0;
 }




Als praktisches Beispiel kann zum Beispiel der "Keylogger" seine Log-Datei per E-Mail verschicken, während ein anderer Thread sich um die Aufzeichnung der Tasten kümmert. Andernfalls, kann es sein das der E-Mail Versand ersteinmal das eigentliche Programm behindert, bzw. bremst.