views:

47

answers:

1

In my application I have a simple module were I will read files for some process that will take few seconds..so I thought of displaying a progress bar(using worker thread) while the files are in progress.I have created a thread (code shown below) and also I designed a dialog window with progress control.I used the function MyThreadFunction below to display the progressbar but it just shows only one time and disappears,I am not sure how to make it work.I tried my best inspite of the fact that I am new to threading.Please help me with this friends.

reading files
void ReadMyFiles()
{

   for(int i = 0; i < fileCount ; fileCount++)
    {   
    CWinThread* myThread = AfxBeginThread((AFX_THREADPROC)MyThreadFunction,NULL);
    tempState = *(checkState + index);
    if(tempCheckState == NOCHECKBOX)
    {
        //my operations
    }
    else//CHECKED or UNCHECKED
    {
        //myoperation
    }
    myThread->PostThreadMessage(WM_QUIT,NULL,NULL);
    }
}

thread functions
UINT MyThreadFunction(LPARAM lparam)
{
    HWND dialogWnd = CreateWindowEx(0,WC_DIALOG,L"Proccessing...",WS_OVERLAPPEDWINDOW|WS_VISIBLE,
                    600,300,280,120,NULL,NULL,NULL,NULL);
    HWND pBarWnd =  CreateWindowEx(NULL,PROGRESS_CLASS,NULL,WS_CHILD|WS_VISIBLE|PBS_MARQUEE,40,20,200,20,
                            dialogWnd,(HMENU)IDD_PROGRESS,NULL,NULL);

    MSG msg;

    PostMessage( pBarWnd, PBM_SETRANGE, 0, MAKELPARAM( 0, 100 ) );
    PostMessage(pBarWnd,PBM_SETPOS,0,0);
    while(PeekMessage(&msg,NULL,NULL,NULL,PM_NOREMOVE))
    {
        if(msg.message == WM_QUIT)
        {
            DestroyWindow(dialogWnd);
            return 1;
        }
        AfxGetThread()->PumpMessage();
        Sleep(40);
    }
    return 1;


}
+1  A: 

Turn it around and put the blocking behavior in the worker thread.

Its a common mistake, but its really NOT worth creating multiple GUI threads in a single process.

Window messages are posted to thread queues :- which means that, at some point, a child, or popup window, is going to try and communicate with a blocked window on another thread. Even if its something the user does unexpectedly like trying to resize or just move the popup window - Which then means that both windows are again blocked on the time consuming process to complete.

Chris Becke
Chris,I didnt get that point "Blocking behaviour",can you tell me what it is?it would be great if you show me an example!
kiddo
The "blocking behavior" refers to the fact that the read file operation blocks the UI thread from its normal processing of messages.
Chris Becke