Brak odpowiedzi programu po kliknięciu na okno

0

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ć?

0

Mógłbyś wkleić kod.

0
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.

0

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.

1

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".

0

Rozumiem, a jak wyglądałoby stworzenie nowego wątku?

1 użytkowników online, w tym zalogowanych: 0, gości: 1