Wyświetlanie danych w oknie

0

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 :

  1. Watek, który uruchamia odpowiednie funkcje czytające i kopiujące dane.
    Te funkcje mają dostęp do zm. globalnej ( double **dane **).
  2. 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.
  3. WM_PAINT wywołuje funkcje WyswietlDane() , która wypisuje dane kopiowane na bieżąco z pliku do pliku.

Pytanie jest takie,

  1. Czy jest to prawidłowe rozwiązanie?

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

  3. 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, &params) ;
                       	                                
                   
                     // wyświetlam zawartość bieżącej danej
                    while(! bZamknijWatek)
                        RedrawWindow(hwnd,NULL,NULL,RDW_INVALIDATE|RDW_UPDATENOW);


     }
0

Zastanawiam się jak rozwiązać problem wypisywania na bieżąco w oknie wartości danych pobieranych z pliku A i zapisywanych do pliku B.

Na bieżąco, wszystkich danych? Po co, i tak nikt nie zdąży tego przeczytać.

Pomyślałem o wykorzystaniu wątku :

O-oo...

  1. Czy jest to prawidłowe rozwiązanie?

Nie dość że to wyświetlanie nikomu się nie przyda, to jeszcze chcesz zamulić system wyświetlając w kółko w pętli, tak jakby to gierka była…

Jak dane kopiujesz? Co jakąś porcję tych danych odświeżaj okno. Wszystko możesz zrobić nawet w jednym wątku, jeśli to wyświetlanie nie spowolni istotnie prędkości kopiowania.

0
  1. Tutaj chodzi o to , czy to jest dobre podejście.
  2. Dla mnie to ma sens, tym bardziej , że będą inne dane wyświetlane , które pozwalają bardzo szybko zorientować się na jakim etapie jest zaciąganie...
    To co podałem to tylko uproszczony przykład.
    Poza tym tak chciałbym rozwiązać kilka innych tematów- m.in. pasek postępu informujący o wielkości pliku kopiowanego z A do B
    3 Jeśli to jest złe to jak to można inaczej rozwiązać to zagadnienie
0

Podbijam temat i mam nadzieję, że ktoś merytorycznie odpowie na zadane pytania.

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