Отображение индикатора прогресса с использованием потоков в приложении win 32! - PullRequest
0 голосов
/ 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

Вы действительно хотите создать новую ветку и индикатор выполнения для каждого отдельного файла? Создайте поток вне цикла for ().

Но это не верный способ сделать это, твой главный интерфейс все еще мертв, как укушенный. Через пару секунд Windows превратит ваше главное окно в призрак с надписью «Не отвечает» в строке заголовка. Вы хотите использовать рабочий поток для выполнения манипулирования файлами, а основной поток - для отображения индикатора выполнения с помощью диалогового окна, которое можно закрыть только в том случае, если рабочий использует PostMessage (), чтобы указать завершение.

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