Multitasking in VC++ 6(threads by AfxBeginThread())

  • 12 years ago

     Hello guys

    I am learning VC++ 6.0 which is not an easy language at all.  I have just learnt how to create threads using AfxBeginThread( ).  I have listed here my own example program (multitask.cpp) to show the use of threads.  Hopefully the program is simple and self explannary to eveybody.  I would like to share what I have learnt!!  I would be grateful if anybody can comment on my program and may suggest a way to improve it.

    All the best



    If anybody wants another version of this program which uses _beginthread() instead of AfxBeginThread(), let me know.


    // multitask.cpp

    // Note : Before building for an executable file, do the following (after compiling):
    //   (1) Choose the [Project] menu
    //   (2) Choose [Settings]
    //   (3) Choose [General] and select [Use MFC in a Static Library]
    //       for [Microsoft Foundation Classes].

    // Note that, when the main application exits/terminates, it kills all its
    // threads.

    // the test.txt file contains "abcdefghi" 

    #include <stdio.h>
    #include <stdlib.h>
    #include <fcntl.h>
    #include <io.h>

    #include <Afxwin.h> // for CWinThread

    #include <windows.h> // for Sleep()
    #include <winbase.h> // for Sleep()

    UINT ThreadFunc(LPVOID pParam);

    class MsgFromFile {
     int fp; char buf[100];
     BOOL OpenDataFile() {
      if ((fp=open("test.txt",O_RDONLY))<0) return FALSE;
       else return TRUE;
     BOOL ReadDataFile(){
      int nbytes, k =0;
      while (TRUE){
       if ((nbytes=read(fp,buf,3-k))<0) return FALSE;
       else if (nbytes == 0) {buf[k]=NULL;return TRUE;}
       else if ((k=k+nbytes)<3) continue;
      return TRUE;
     void WriteMsg(){ printf("Thread:%s\n",buf);}

    char gMsg[100]; // global to the threads too!

     MsgFromFile a;
     int iPriority = 0;
     CWinThread* ThreadID[2];

     printf("The main application: ");

     strcpy(gMsg,"This works");

     //Start the independent threads
     ThreadID[0] = AfxBeginThread(ThreadFunc,(LPVOID)&a,iPriority);
     ThreadID[1] = AfxBeginThread(ThreadFunc,(LPVOID)&a,iPriority);
     //ThreadID[0]->SuspendThread(); //This suspends the thread ThreadID[0].It does not kill
             //the thread.
     //ThreadID[0]->ResumeThread(); //This resumes the thread ThreadID[0].

     //Wait until the threads have died.
     HANDLE hthread;
     hthread= ThreadID[0]->m_hThread;
     hthread = ThreadID[1]->m_hThread;

     printf("The main application: "); a.WriteMsg();
     printf("The main application(parent) exits\n");
     Sleep(10000); //Sleep for 10 seconds

    } // main

    UINT ThreadFunc(LPVOID pParam)

     MsgFromFile* myfile = (MsgFromFile*)pParam;

     if (!(myfile->ReadDataFile())) {
      printf("Thread: failed to read the data file\n");
      //exit(-1); //This kills the main application too!
      return 0;
     } // if

     printf("Thread: %s \n", gMsg);

     printf("Thread: exits\n");

     return 0;
    } // ThreadFunc

Post a reply

No one has replied yet! Why not be the first?

Sign in or Join us (it's free).


Why not write for us? Or you could submit an event or a user group in your area. Alternatively just tell us what you think!

Our tools

We've got automatic conversion tools to convert C# to VB.NET, VB.NET to C#. Also you can compress javascript and compress css and generate sql connection strings.

“XML is like violence - if it's not working for you, you're not using enough of it.”