Írjon a fájlt több szálat

Írjon a fájlt több szálat

Jó napot,
Talán valaki meg tudja mondani, hogyan kell megszervezni bejegyzés a zenei fájlt a különböző szálak. Az ötlet talált ilyen hozzon létre egy áramlás, amely nem a tényleges felvétel és az összes többi szál küldi őt a PostMessage, de nem tudja, hogyan hajtják végre, akkor minden élőlény tud segíteni? Hogyan kell csinálni, talán valaki tudja, hogy egy igazi teszt megoldás?

Ha a szálak lehet tétlen, majd egy kritikus szakasz elegendő

Hogyan lehetséges, hogy írjon a többszálas alkalmazások, nem tudta, hogyan kell küldeni egy patak PostMessage?

> És az összes többi szál küld neki PostMessage
normális ötlet, IMHO, a legegyszerűbb (nincs szükség semmilyen trükk). nemcsak PostMessage és PostThreadMessage.

> Lehet bármilyen élőlény tud segíteni?
zaguglit. és indítsa csinál valamit. kifejezetten kérte, hogy mi segített. és hogy „általában” úgy hangzik, mint „nem értem.”

> Hogyan lehetséges, hogy írjon a többszálas alkalmazások
szar. még gyakrabban szembesülnek azzal a ténnyel, hogy ezek az „öntött” a kódot csak úgy „a hideg.”

És akkor nézd meg a feladatkezelő, és úgy gondolja is, hogy miért egy ilyen egyszerű program 50 stream?

Visszatérve erre a problémára -, és aki követi a sorrendben rekordok egy fájlt több szálat?

A rend tiszteletben fogják tartani, „automatikus”, az üzenetben sorban. elsőnek jött - elsőnek rögzíteni.

És hol ebben az esetben a garancia arra, hogy az adatok lesz írva a helyes sorrendben?

ez minden, amit tudni? Hát ez olyan, mint a golyók egy gép repült ki jobbra elhelyezése a kürt.
és hol van a garancia a helyes sorrendben?
kritériumok „helyes” hangot. ha ez az Ön számára - a tizedik megérkezett, de ő „blat”, azt jelenti, az első, hogy elhagyja, akkor világos, hogy ha az összes nem alkalmas a „rossz”.


> Kritériumai „korrektség” hang

Csak egy - az adatok integritását. Ha az áramlás kezdődik random write (append) adatokat fájlba, akkor mi fog történni? Még ha minden sorban? Itt nem verem LIFO, ami az automata kürt.


> Mi az a lényeg, hogy beszélni a részleteket a probléma

A feladatot mindannyian feledésbe merült :)

Köszönöm mindenkinek a válaszokat,
Nem fut el, én most próbálja megpróbál mindent megtenni,


# XA0; Védett láncolt lista a sorban
# XA0; a többszálú módban (first-in-first-out)

felhasználások
ablakok,
SyncObjs,
SysUtils;

típus
PItemList = ^ TItemList;
TItemList = rekord
# XA0; Prev, Next: PItemList;
# XA0; Adatok: # XA0; # XA0; # XA0; PChar;
végén;

TPushPop = osztály (TObject)
magán
# XA0 FCS: # XA0; # XA0; # XA0; # XA0; TCriticalSection;
# XA0; FRootItem: # XA0; PItemList;
# XA0; FLastItem: # XA0; PItemList;
# XA0; FItemsCount: integer;
# XA0; FWaitEvent: # XA0; THandle;
# XA0; eljárás lezárása;
# XA0; eljárást Feloldás;
# XA0; eljárás DeleteItem0; inline;
# XA0; funkció GetCount: integer;
nyilvános
# XA0; kivitelező létrehozása;
# XA0; destructor megsemmisíti; felülbírálhatja;
# XA0; eljárással push (const s: string);
# XA0; eljárással PopAllToFile (const fájlnév: string);
# XA0; eljárással PushFromFile (const fájlnév: string);
# XA0; függvény létezik (const Str: string): logikai;
# XA0; funkció Pop: string;
# XA0; funkció Peek: string;
# XA0; eljárás törlése; inline;
# XA0; eljárás WaitForItem;
# XA0; tulajdon Count: integer Read GetCount;
végén;

const
FileDelim = # 1;

funkció ExtractFileFromConcate (const s: string): string; inline;
funkció ExtractAddInfoFromConcate (const s: string): string; inline;

kivitelező TPushPop.Create;
kezdődik
örökölt;
Új (FRootItem);
Új (FLastItem);

FRootItem.Prev: = nil;
FRootItem.Next: = FLastItem;
FRootItem.Data: = nil;
FLastItem.Prev: = FRootItem;
FLastItem.Data: = nil;
FLastItem.Next: = nil;

FCS: = TCriticalSection.Create;
FWaitEvent: = CreateEvent (nulla, True, False, nulla);
végén;

destructor TPushPop.Destroy;
kezdődik
Tiszta;
Dobja (FRootItem);
Dobja (FLastItem);
FreeAndNil (FCS);
CloseHandle (FWaitEvent);
örökölt;
végén;

függvény TPushPop.Exists (const Str: string): logikai;
var
CurrItem: PItemList;
kezdődik
Lock;
megpróbál
# XA0; CurrItem: = FRootItem;
# XA0; Eredmény: = false;
# XA0, míg (CurrItem <> FLastItem) do
# XA0; kezdődik
# XA0; ha ExtractFileFromConcate (string (CurrItem.Data)) = Str majd
# XA0; # XA0; Exit (True);
# XA0; CurrItem: = CurrItem.Next;
# XA0; end;
végül
# XA0; feloldás;
végén;
végén;

eljárás TPushPop.Lock;
kezdődik
FCS.Enter;
végén;

eljárás TPushPop.Unlock;
kezdődik
FCS.Leave;
végén;

eljárás TPushPop.WaitForItem;
kezdődik
WaitForSingleObject (FWaitEvent, INFINITE);
végén;

eljárás TPushPop.DeleteItem0;
var
p: PItemList;
kezdődik
ha FItemsCount = 0, akkor
# XA0; kilépés;
p: = FRootItem.Next;

p.Prev.Next: = p.Next;
p.Next.Prev: = p.Prev;

funkció TPushPop.Peek: string;
var
Len: integer;
kezdődik
Lock;
megpróbál
# XA0; Len: = strlen (FRootItem.Next.Data);
# XA0; SetLength (Eredmény, Len);
# XA0; lépés (FRootItem.Next.Data ^, Eredmény [1], Len * sizeof (char));
végül
# XA0; feloldás;
végén;
végén;

funkció TPushPop.Pop: string;
var
Len: integer;
kezdődik
Lock;
megpróbál
# XA0; ha Count = 0, akkor
# XA0; emelje Exception.Create ( "alul elfolyó a TPushPop.Pop!");
# XA0; Len: = strlen (PWideChar (FRootItem.Next.Data));
# XA0; SetLength (Eredmény, Len);
# XA0; ha Len> 0, akkor
# XA0; mozgatni (FRootItem.Next.Data ^, Eredmény [1], Len * sizeof (char));
# XA0; FreeMem (FRootItem.Next.Data);
# XA0; DeleteItem0;
# XA0; ha Count = 0, akkor
# XA0; ResetEvent (FWaitEvent);
végül
# XA0; feloldás;
végén;
végén;

eljárás TPushPop.Push (const s: string);
var
p: PItemList;
TempChar: PChar;
kezdődik
TempChar: = AllocMem ((hossza (s) + 1) * sizeof (char));
Ha a length (s)> 0, akkor
# XA0; lépés (ek [1], TempChar ^, Hossz (s) * sizeof (char));
Lock;
megpróbál
# XA0; Új (p);
# XA0; p.Data: = TempChar;

# XA0; p.Prev: = FLastItem.Prev;
# XA0; p.Next: = FLastItem;
# XA0; FLastItem.Prev.Next: = p;
# XA0; FLastItem.Prev: = p;

# XA0 Inc. (FItemsCount);
# XA0; SetEvent (FWaitEvent);
végül
# XA0; feloldás;
végén;
végén;

funkció TPushPop.GetCount: integer;
kezdődik
ha Címzett (FCS), majd
kezdődik
# XA0; Lock;
# XA0, próbálja
# XA0; Eredmény: = FItemsCount;
# XA0, végül
# XA0; kinyit;
# XA0; end;
vég
más
# XA0; Eredmény: = 0;
végén;

eljárás TPushPop.Clear;
kezdődik
míg Count <> 0 do
# XA0; Pop;
végén;

eljárás TPushPop.PopAllToFile (const fájlnév: string);
var
F: TextFile;
kezdődik
ha Count = 0, akkor
# XA0; kilépés;
AssignFile (F, fájlnév);
megpróbál
# XA0; átírási (F);
kivéve
# XA0; kilépés;
végén;
megpróbál
# XA0, míg Count <> 0 do
# XA0; WriteLn (F, Pop);
végül
# XA0; CloseFile (F);
végén;
végén;

eljárás TPushPop.PushFromFile (const fájlnév: string);
var
F: TextFile;
s: string;
kezdődik
ha nem FileExists (fájlnév), majd
# XA0; kilépés;
AssignFile (F, fájlnév);
megpróbál
# XA0; reset (F);
kivéve
# XA0; kilépés;
végén;
megpróbál
# XA0, míg nem EOF (F) do
# XA0; kezdődik
# XA0; ReadLn (F, s);
# XA0; Push (s);
# XA0; end;
végül
# XA0; CloseFile (F);
végén;
DeleteFile (fájlnév);
végén;

Hogyan kell használni. Az érintett vízfolyások do tolja. Egy csinál Pop. Mint lehetőség - időről időre „hogy húzza” PopAllToFile - az osztály maga megtartja # XA0, a fájl tartalmát.


> Ez minden, amit tudni? Hát ez olyan, mint a golyók egy gép
> Repült ki jobbra elhelyezése a kürt.
> És hol van a garancia a helyes sorrendben?

By the way, a sorozat még mindig ott van. Ezek nem törvényes, pusztán egyéni. De van. Például minden harmadik - nyomjelző. Vagy az elmúlt 5 - jelölőanyagok.

> Például, minden harmadik - nyomjelző. Vagy az elmúlt 5 - jelölőanyagok.
Ez az esemény típusa (lövés) a sorozat, de nem magát. itt van a jobb. azaz írja illik bele a kúp révén két jelölőanyagok, azaz Arra számítok, hogy lesz egy harmadik, és hirtelen vette és a helytelen. először az összes jelölőanyagok, majd máskor, vagy fordítva, vagy minden harmadik, és a közepén triplett. Nos, valami ilyesmi. (És akkor kiderül, hogy ha például a 3. és a 6., települések változtatni, mert helyesek voltak, bár valószínűtlen)
és azt akarta, hogy megtalálják azokat a feltételeket, hogy megértsük, mi tartja rossz az „első küldött, az első legénységi, stb”

Memória: 0.78 MB
Idő: 0,209 c