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:
InitCommonControls();
hProgressBar = CreateWindowEx( 0, PROGRESS_CLASS, NULL, WS_CHILD | WS_VISIBLE | PBS_MARQUEE, 10, 10, 200, 15, hwnd,( HMENU ) ID_PROGRESS_BAR, hThisInstance, NULL );
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. |
|
MrPoxipol |
» 2013-09-02 16:36:12 'Czasochłonną' operację musisz wykonywać w innym wątku. |
|
kubek3898 Temat założony przez niniejszego użytkownika |
» 2013-09-02 17:27:50 Zmieniłem, więc kod na taki: #include <process.h>
void __cdecl ThreadProc( void * Args ); HANDLE hThread;
void __cdecl ThreadProc( void * Args ) { SendMessage( hProgressBar, PBM_SETMARQUEE, TRUE, 0 ); }
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. |
|
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. |
|
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 |
|
pekfos |
» 2013-09-02 18:28:32 Nie możesz tu podać dowolnej funkcji. |
|
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": { 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. |
|
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? |
|
« 1 » 2 |