Sytuacja ma się tak: Po naciśnięciu przycisku tworzy się okno potomne, któro zawiera pasek postępu. Gdy jednak podczas ładowania pasek przez jakiś czas nie rusza się (efekt celowy, po prostu pewna operacja trwa troszkę dłużej), a użytkownik kliknie na okienko, wszystko się zawiesza i jest brak odpowiedzi. Jak temu zaradzić?
Mógłbyś wkleić kod.
void pobierz( string sciezkaLokalna, string sciezkaSerwer, string plik )
{
HWND hLoading;
hLoading = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass","Ładowanie. Proszę czekać.", WS_VISIBLE,
CW_USEDEFAULT, /* x */
CW_USEDEFAULT, /* y */
300, /* width */
100, /* height */
NULL,NULL,hInstance,NULL);
HWND hProgressBar = CreateWindowEx( 0, PROGRESS_CLASS, NULL, WS_CHILD | WS_VISIBLE | PBS_MARQUEE,
10, 10, 270, 20, hLoading, NULL, hInstance, NULL );
HWND hStatus = CreateWindowEx( 0, "STATIC", "Łączenie z serwerem...", WS_CHILD | WS_VISIBLE |
SS_LEFT, 10, 40, 270, 30, hLoading, NULL, hInstance, NULL );
LOGFONT lf = {};
lf.lfHeight = -13;
strcpy(lf.lfFaceName, "Segoe UI");
HFONT hFontSs = CreateFontIndirect(&lf);
SendMessage( hStatus, WM_SETFONT, (WPARAM)hFontSs, false );
SendMessage( hProgressBar, PBM_SETRANGE, 0,( LPARAM ) MAKELONG( 0, 100 ) );
SendMessage( hProgressBar, PBM_SETPOS,( WPARAM ) 100, 0 );
sf::Ftp ftp;
int odpserw = ftp.connect("[serwer]", 21, sf::seconds(15)).getStatus();
//i tak dalej, kolejne operacje...
}
Funkcja ta jest wywoływana po naciśnięciu przycisku.
Ale ten fragment niczego mogącego mieć wpływ na to nie pokazuje. Skróciłeś kod o najbardziej istotne rzeczy bo brakuje kodu pobierania (i aktualizacji progressbara), nie ma też kodu procedury obsługi okna.
Gdy jednak podczas ładowania pasek przez jakiś czas nie rusza się (efekt celowy, po prostu pewna operacja trwa troszkę dłużej), a użytkownik kliknie na okienko, wszystko się zawiesza i jest brak odpowiedz
Dlatego że okno nie obsługuje komunikatów - jeśli masz tam blokującą funkcję która czeka długo na jakieś zdarzenie, to powinna być w osobnym wątku.
A jeśli masz pętlę która kręci się wiele razy i trwa przez to długo, to w niej powinieneś od czasu do czasu obsłużyć komunikaty okna (PeekMessage/TranslateMessage/DispatchMessage).
Reakcja okna na kliknięcie może być tylko jeśli komunikat pobrano (to robi GetMessage albo PeekMessage) i wywołano procedurę okna (WndProc, wywoływana jest przez DispatchMessage).
Pokaż kod jak wygląda ta twoja operacja "troszkę dłuższa".
Rozumiem, a jak wyglądałoby stworzenie nowego wątku?