Как показать прогресс-бар, используя функциональность потоков в win32? - PullRequest
2 голосов
/ 27 апреля 2010

В моем приложении у меня есть простой модуль, где я буду читать файлы для некоторого процесса, который займет несколько секунд ... так что я думал об отображении индикатора выполнения (используя рабочий поток), пока файлы находятся в процессе. Я создал поток (код показан ниже), а также я разработал диалоговое окно с контролем выполнения. Я использовал функцию MyThreadFunction ниже, чтобы отобразить индикатор выполнения, но он отображается только один раз и исчезает, я не уверен, как заставить его работать. Я старался изо всех сил, несмотря на то, что я новичок в потоках. Пожалуйста, помогите мне с этими друзьями.

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 Ответ

1 голос
/ 27 апреля 2010

Переверните его и поместите поведение блокировки в рабочий поток.

Это распространенная ошибка, но на самом деле НЕ стоит создавать несколько потоков GUI в одном процессе.

Сообщения окна отправляются в очереди потоков: - это означает, что в какой-то момент дочернее или всплывающее окно попытается установить связь с заблокированным окном в другом потоке. Даже если пользователь что-то делает неожиданно, например, пытается изменить его размер или просто переместить всплывающее окно, что означает, что оба окна снова заблокированы, чтобы завершить длительный процесс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...