Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[WinAPI] Progress bar, a raczej problem z jego uruchomieniem

Ostatnio zmodyfikowano 2013-09-03 17:52
Autor Wiadomość
kubek3898
Temat założony przez niniejszego użytkownika
[WinAPI] Progress bar, a raczej problem z jego uruchomieniem
» 2013-09-02 14:38:42
Mam w aplikacji funkcję, której wykonanie trwa dłuższą chwilę. Odpowiednim wyjściem z opisu była by kontrolka Progress Bar. Problem w tym, że nie działa mi jej uruchomienie. Cząstki kodu:

C/C++
// Funkcja WinMain...
// definicja uchwytów...
InitCommonControls();
// dalszy kod...
hProgressBar = CreateWindowEx( 0, PROGRESS_CLASS, NULL, WS_CHILD | WS_VISIBLE | PBS_MARQUEE, 10, 10, 200, 15, hwnd,( HMENU ) ID_PROGRESS_BAR, hThisInstance, NULL );
// Koniec WinMain
// Funkcja obsługi zdarzeń
LRESULT CALLBACK WindowProcedure( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{
    switch( message )
    {
    case WM_COMMAND:
        {
            switch( wParam )
            {
            case ID_HWND_BUTTON:
                SendMessage( hProgressBar, PBM_SETMARQUEE, TRUE, 0 );
                jakasDlugoWykonujacaSieFunkcja();
                SendMessage( hProgressBar, PBM_SETMARQUEE, FALSE, 0 );
                break;
                default:
                break;
            }
        }
    case WM_DESTROY:
        PostQuitMessage( 0 );
        break;
        default:
        return DefWindowProc( hwnd, message, wParam, lParam );
    }
   
    return 0;
}

Problem w tym, że pasek w ogóle nie ładuje się, choć z tego co czytałem w kursie, powinien pojawić się trwający w nieskończoność pasek ładowania. Wie ktoś jak to rozwiązać?

PS. Kod się kompiluje oczywiście.
P-91419
MrPoxipol
» 2013-09-02 16:36:12
'Czasochłonną' operację musisz wykonywać w innym wątku.
P-91434
kubek3898
Temat założony przez niniejszego użytkownika
» 2013-09-02 17:27:50
Zmieniłem, więc kod na taki:

C/C++
#include <process.h>

// Kod...

void __cdecl ThreadProc( void * Args );
HANDLE hThread;

// Kod...

void __cdecl ThreadProc( void * Args )
{
    SendMessage( hProgressBar, PBM_SETMARQUEE, TRUE, 0 );
}

// W obsłudze zdarzeń:

LRESULT CALLBACK WindowProcedure( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{
    switch( message )
    {
    case WM_COMMAND:
        {
            switch( wParam )
            {
            case ID_HWND_BUTTON:
                hThread =( HANDLE ) _beginthread( ThreadProc, 0, NULL );
                WaitForSingleObject( hThread, INFINITE );
                dlugaFunkcja();
                break;
                default:
                break;
            }
        }
    case WM_DESTROY:
        PostQuitMessage( 0 );
        break;
        default:
        return DefWindowProc( hwnd, message, wParam, lParam );
    }
   
    return 0;
}

Ale program się zawiesza.
P-91436
pekfos
» 2013-09-02 17:39:49
Zła procedura wątku. Poza tym i tak program się zawiesi, bo to dlugaFunkcja() ma być w oddzielnym wątku.
P-91437
kubek3898
Temat założony przez niniejszego użytkownika
» 2013-09-02 18:21:06
A co jeśli typem zwracanym jest np. int? Argumentem funkcji beginthread jest typ void
P-91442
pekfos
» 2013-09-02 18:28:32
Nie możesz tu podać dowolnej funkcji.
P-91443
kubek3898
Temat założony przez niniejszego użytkownika
» 2013-09-02 19:54:31
Okej, teraz już się nie zawiesza, lecz dalej wykonuje tak, jak to powiedzieć "linijka po linijce":

C/C++
{
    hThread =( HANDLE ) _beginthread( ThreadProc, 0, NULL );
    DWORD result = WaitForSingleObject( hThread, 6000 );
    MessageBox( 0, "Prosze czekac", "wait", MB_OK | MB_ICONASTERISK );
    if( result == WAIT_OBJECT_0 )
    {
        MessageBox( 0, "OK", "wait", MB_OK | MB_ICONASTERISK );
    }
    else if( result == WAIT_TIMEOUT )
    {
        MessageBox( 0, "Failed", "Error", MB_OK | MB_ICONASTERISK );
    }
    break;
}

Chciałbym, by MessageBox Proszę czekać był wyświetlany, a jednocześnie by w tym samym czasie funkcja ThreadProc robiła to co do niej należy :D. Jednak najpierw funkcja robi swoje (co zwiesza program), a dopiero później wyskakuje Box.
P-91444
pekfos
» 2013-09-02 20:39:38
To po co czekasz na zakończenie wątku zaraz po jego utworzeniu? Rozumiesz coś z tego, co piszesz?
P-91447
« 1 » 2
  Strona 1 z 2 Następna strona