Witam!
Zastanawiam się jak rozwiązać problem wypisywania na bieżąco w oknie wartości danych pobieranych z pliku A i zapisywanych do pliku B.
Pomyślałem o wykorzystaniu wątku :
- Watek, który uruchamia odpowiednie funkcje czytające i kopiujące dane.
Te funkcje mają dostęp do zm. globalnej ( double **dane **). - Wątek jest uruchamiany w gł. procedurze okna w obsłudze kom. WM_COMMAND, gdy np. z menu wybierze się kopiuj dane
W obsłudze komunikatu jest również pętla , która wywołuje WM_PAINT, tak długo jak długa działa wątek kopiujący dane. - WM_PAINT wywołuje funkcje WyswietlDane() , która wypisuje dane kopiowane na bieżąco z pliku do pliku.
Pytanie jest takie,
-
Czy jest to prawidłowe rozwiązanie?
-
Czy nie potrzebuje tutaj synchronizacji wątku z wątkiem gł. ? Wątek gł. tylko czyta ( wyświetla) zm. globalną ( double **dane **) , która jest na bieżąco zapisywana przez funkcje wątku podrzędnego, więc zakładam , że nie jest potrzebna synchronizacja.
-
Działanie programu w oparciu o takie podejście - po skopiowaniu ok. kilkudziesięciu tyś. wartości ( które prawidłowo wyświetla) wyświetlanie danych się zawiesza i odświeżenie okna pojawia się dopiero gdy wątek podrzędny zakończy pracę wyświetlając komunikat końcowy.
Dlaczego?
Czy to może skutek braku synchronizacji - jakaś kolizja?
double dane;
// 1. Wątek Czyta dane i kopiuje je do innego pliku.
// Każda odczytana wartość w funkcji CzytajDane() jest wrzucana do zm. globalnej
void Thread (PVOID pvoid)
{
CzytajDane();
ZapiszDane ();
bZamknijWatek = TRUE;
_endthread ();
}
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
case WM_COMMAND:
switch (wParam)
{
case IDM_Kopiuj_Dane:
{
// uruchamiam wątek
_beginthread (Thread, 0, ¶ms) ;
// wyświetlam zawartość bieżącej danej
while(! bZamknijWatek)
RedrawWindow(hwnd,NULL,NULL,RDW_INVALIDATE|RDW_UPDATENOW);
}