dwa wątki korzystające z jednego pliku tekstowego

0

Witam,

Chciałbym napisać program który w jednym nowo utworzonym wątku będzie dodawał dane linijka po linijce do pliku tekstowego, a drugi wątek będzie odczytywał te dane linia po linii (jeśli to możliwe to najlepiej jeśli by od razu usuwał "przeczytaną" linijkę).
Program piszę w C++ Builderze (ale w języku C) więc z wątkami nie ma problemu (TThreads) - chodzi jedynie o dostęp do pliku. Jak to zrealizować?
W pierwszym wątku otwieram plik funkcją fopen("test.txt", "a").
Można prosić o jakieś wskazówki jak teraz zrobić żeby drugi wątek odczytywał od początku pliku do końca dane linijka po linijce, jednocześnie usuwając tą przeczytaną?

Myślałem żeby zrobić ciągłe odpytywanie czy coś zostało dodane do pliku, ale nawet to nie działa - od razu wątek się kończy po uruchomieniu. Oto kod:

 
void __fastcall MyThread::Execute() 
 { 


        if ((plik=fopen("test.txt", "r"))==NULL) { 
                Application->MessageBox(L"Błąd otwierania pliku.",L"Błąd!", MB_OK | MB_ICONWARNING); 
        } 

        while(1) 
        { 

               if(!feof(plik)) 
              { 

                  //jakaś operacja... 

              } 

        } 

 }
0

Użyj jakiegoś obiektu synchronizacji wątków: sekcja krytyczna, zdarzenie, mutex itp.

Kiedy jeden wątek będzie korzystał z pliku, to drugi nie będzie mógł dopóki pierwszy nie skończy.

Tylko nie wiem po co w to angażujesz plik - operacje dyskowe są dużo wolniejsze, niż te z użyciem pamięci RAM. Lepiej by było gdybyś skorzystał ze struktury dynamicznej (np. lista, stos). Jeden wątek by kładł na stos, drugi by ściągał ze stosu. I to też najlepiej by było z użyciem obiektu synchronizacji.

0

Dzięki za odpowiedź. Ale będzie to wydajne rozwiązanie gdy muszę przetrzymać dane które napływają czasami w tempie powiedzmy że nawet do 2000/sekundę? Chcę je gdzieś przetrzymywać, bo muszę je wpisywać do bazy danych, jednak operacja ta jest na tyle wolna, że program gubi część danych które przychodzą.

1

Na pewno będzie wydajniejsze niż operacje na pliku :)

Naszkicowałem kod w Python'ie (v2.7):

from datetime import datetime

a=[]
d1=datetime.now()
for i in xrange(10000000):
	a.append("dfkljgldfj gdfgjl kdfjgkl dfjgkl dfjlgjldk fjgkldf")
print datetime.now()-d1

Na moim kompie 10 milionów elementów dodaje się do listy mniej więcej sekundę (czasem nieco krócej czasem nieco dłużej - nieznaczne ułamki sekundy ;) ).

0

To jest właśnie rozwiązanie mojego problemu... Dzięki wielkie. Aż wstyd jak tak teraz pomyśle że chciałem to rozwiązać poprzez pliki :P

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