Scrieți la un fișier din mai multe fire

Scrieți la un fișier din mai multe fire

O zi bună,
Poate cineva poate spune cum să organizeze o înregistrare într-un fișier din diferite fire. Ideea este de a crea un fir care va face înregistrarea reală și toate celelalte fire vor fi trimise la PostMessage, dar nu știu cum să o implementeze, poate cineva să ajute? Cum se poate face acest lucru, poate cineva să știe o soluție mai corectă?

Dacă firele pot fi în stare de așteptare, este suficient să folosiți secțiunea critică

Cum pot scrie o aplicație cu mai multe fire, fără să știe cum să trimită mesajul PostMessage la fir?

> și toate celelalte fire vor fi trimise la PostMessage
o idee normală, IMHO, cea mai simplă (nu este nevoie de trucuri). nu numai PostMessage, ci PostThreadMessage.

> Poate ajuta cineva?
au fost interzise. și începeți să faceți ceva. întrebați în mod specific, pentru a vă ajuta. și apoi "în general" sună ca "fă-o pentru mine".

> Cum pot să scriu o aplicație cu mai multe fire?
e de rahat. În general, am întâlnit de multe ori faptul că ei "formează" în cod doar pentru că "e cool".

Și apoi te uiți în managerul de sarcini și te gândești bine la un program atât de simplu de 50 de fluxuri?

Revenind la această sarcină - și cine va urma ordinea înregistrării într-un fișier din mai multe fire?

ordinea va fi observată "automat", la rândul său mesaje. a venit primul - sa semnat prima dată.

Și unde este garanția că datele vor fi înregistrate în succesiunea corectă?

ce fel de coadă știi? Ei bine, de exemplu, cartușele de pe mașină zboară în ordinea stivuirii în claxon.
și unde este garanția consecvenței corecte?
criteriile pentru "corectitudine". dacă pentru tine ea este a zecea a venit, dar el are un "blat", atunci primul trebuie să plece, atunci, evident, linia nu este potrivit pentru tine pentru că "greșit".


> criteriile de "corectitudine" pentru a suna

Numai una - integritatea informațiilor. Dacă firele încep să scrie (atașează) datele în fișier, ce se va întâmpla? Chiar dacă se aliniază? Aici nu avem stiva LIFO, care este un corn automat.


> Care este punctul de discuție a detaliilor problemei

Despre problema a fost mult timp uitat :)

Multe mulțumiri tuturor pentru răspunsuri,
Nu am fugit, voi încerca să încerc să fac totul astăzi


# xA0; Listă securizată conectată pentru a lucra cu coada de așteptare
# xA0; în modul multithreaded (primul-în-primul-out)

utilizări
ferestre,
SyncObjs,
SysUtils;

tip
PItemList = ^ TItemList;
TItemList = înregistrare
# xA0; Prev, Următorul: PItemList;
# xA0; Date: # xA0; # xA0; # xA0; PChar;
se încheie;

TPushPop = clasă (TObject)
privat
# xA0; FCS: # xA0; # xA0; # xA0; # xA0; TCriticalSection;
# xA0; FRootItem: # xA0; PItemList;
# xA0; FLastItem: # xA0; PItemList;
# xA0; FItemsCount: număr întreg;
# xA0; FWaitEvent: # xA0; Thandle;
# xA0; Blocarea procedurii;
# xA0; deblocarea procedurii;
# xA0; procedure DeleteItem0; inline;
# xA0; funcția GetCount: integer;
public
# xA0; constructor Creare;
# xA0; distrugătorul distrugător; suprascrie;
# xA0; procedura Push (const s: string);
# xA0; procedura PopAllToFile (const FileName: string);
# xA0; procedura PushFromFile (const FileName: string);
# xA0; există funcția (const Str: string): boolean;
# xA0; funcția Pop: șir;
# xA0; funcție Peek: șir;
# xA0; procedura Clear; inline;
# xA0; procedura WaitForItem;
# xA0; Count property: integer Citiți GetCount;
se încheie;

const
FileDelim = # 1;

funcția ExtractFileFromConcate (const s: șir): șir; inline;
funcția ExtractAddInfoFromConcate (const s: string): șir; inline;

constructor TPushPop.Create;
începe
moștenit;
Nou (FRootItem);
Nou (FLastItem);

FRootItem.Prev: = zero;
FRootItem.Next: = FLastItem;
FRootItem.Data: = zero;
FLastItem.Prev: = FRootItem;
Dată de expunere: = zero;
FLastItem.Next: = zero;

FCS: = TCriticalSection.Create;
FWaitEvent: = CreateEvent (zero, adevărat, fals, zero);
se încheie;

destructor TPushPop.Destroy;
începe
Clear;
Aruncați (FRootItem);
Aruncați (FLastItem);
FreeAndNil (FCS);
CloseHandle (FWaitEvent);
moștenit;
se încheie;

funcția TPushPop.Exists (const Str: șir): boolean;
var
CurrItem: PItemList;
începe
Lock;
încerca
# xA0; CurrItem: = FRootItem;
# xA0; Rezultat: = False;
# xA0; în timp ce (CurrItem <> FLastItem)
# xA0; începeți
# xA0; dacă ExtractFileFromConcate (șir (CurrItem.Data)) = Str atunci
# xA0; # xA0; Ieșire (Adevărat);
# xA0; CurrItem: = CurrItem.Next;
# xA0; sfârșitul;
în cele din urmă
# xA0; Deblocați;
se încheie;
se încheie;

procedura TPushPop.Lock;
începe
FCS.Enter;
se încheie;

procedura TPushPop.Unlock;
începe
FCS.Leave;
se încheie;

procedura TPushPop.WaitForItem;
începe
WaitForSingleObject (FWaitEvent, INFINITE);
se încheie;

procedura TPushPop.DeleteItem0;
var
p: PItemList;
începe
dacă FItemsCount = 0 atunci
# xA0; Ieșire;
p: = FRootItem.Next;

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

funcția TPushPop.Peek: șir;
var
Len: întreg;
începe
Lock;
încerca
# xA0; Len: = StrLen (FRootItem.Next.Data);
# xA0; SetLength (Rezultat, Len);
# xA0; mutați (FRootItem.Next.Data ^, Rezultat [1], Len * SizeOf (char));
în cele din urmă
# xA0; Deblocați;
se încheie;
se încheie;

funcția TPushPop.Pop: șir;
var
Len: întreg;
începe
Lock;
încerca
# xA0; dacă Count = 0 atunci
# xA0; ridicați Exception.Create ("UnderFlow în TPushPop.Pop!");
# xA0; Len: = StrLen (PWideChar (FRootItem.Next.Data));
# xA0; SetLength (Rezultat, Len);
# xA0; dacă Len> 0 atunci
# xA0; mutați (FRootItem.Next.Data ^, Rezultat [1], Len * SizeOf (char));
# xA0; FreeMem (FRootItem.Next.Data);
# xA0; DeleteItem0;
# xA0; dacă Count = 0 atunci
# xA0; ResetEvent (FWaitEvent);
în cele din urmă
# xA0; Deblocați;
se încheie;
se încheie;

procedura TPushPop.Push (const s: string);
var
p: PItemList;
TempChar: PChar;
începe
TempChar: = AllocMem ((Lungime (e) + 1) * SizeOf (char));
dacă lungimea (e)> 0 atunci
# xA0; mutați (s [1], TempChar ^, Lungime (e) * SizeOf (char));
Lock;
încerca
# xA0; Noi (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);
în cele din urmă
# xA0; Deblocați;
se încheie;
se încheie;

funcția TPushPop.GetCount: întreg;
începe
dacă este atribuită (FCS) atunci
începe
# xA0; Blocare;
# xA0; încercați
# xA0; Rezultat: = FItemsCount;
# xA0; în cele din urmă
# xA0; debloca;
# xA0; sfârșitul;
capăt
altfel
# xA0; Rezultat: = 0;
se încheie;

procedura TPushPop.Clear;
începe
în timp ce Contele <> 0 face
# xA0; Pop;
se încheie;

procedura TPushPop.PopAllToFile (const FileName: string);
var
F: TextFile;
începe
dacă Count = 0 atunci
# xA0; Ieșire;
Atribuiți fișierul (F, Nume de fișier);
încerca
# xA0; Rescrie (F);
cu excepția
# xA0; Ieșire;
se încheie;
încerca
# xA0; în timp ce Count <> 0 face
# xA0; WriteLn (F, Pop);
în cele din urmă
# xA0; CloseFile (F);
se încheie;
se încheie;

procedura TPushPop.PushFromFile (const FileName: string);
var
F: TextFile;
s: șir;
începe
dacă nu FileExists (FileName) atunci
# xA0; Ieșire;
Atribuiți fișierul (F, Nume de fișier);
încerca
# xA0; Resetați (F);
cu excepția
# xA0; Ieșire;
se încheie;
încerca
# xA0; în timp ce nu Eof (F) face
# xA0; începeți
# xA0; ReadLn (F, s);
# xA0; Împingeți;
# xA0; sfârșitul;
în cele din urmă
# xA0; CloseFile (F);
se încheie;
DeleteFile (nume de fișier);
se încheie;

Cum să utilizați. Din fluxurile necesare face Push. De la unul la Pop. Ca o opțiune - periodic "trageți" PopAllToFile - clasa în sine va păstra propria sa # xA0; conținutul în fișier.


> Ce este coada pe care o cunoști? Ei bine, e ca niște cartușe de la un mitralieră
> decolați în ordinea ambalării în corn.
> și unde este garanția consecvenței corecte?

Apropo, există o secvență. Nu sunt statutari, pur individuali. Dar există. De exemplu, fiecare al treilea indicator. Sau ultimii 5 - markeri.

> De exemplu, fiecare treime este un trasor. Sau ultimii 5 - markeri.
acesta este tipul de eveniment (împușcat) în secvență, nu în sine. aici este vorba de ordin. și anume tip, puneți markeri în corn prin două, adică se așteaptă să fie una din trei, dar a luat brusc și a greșit. mai întâi toate marcatorii, și după obișnuit sau invers, sau nu la fiecare treime, ci în mijlocul troicii. Ei bine, într-un fel. (și veți obține asta dacă, de exemplu, a treia și a șasea, în unele locuri sa schimbat, este ca și cum ar fi bine, deși este incredibil)
și ar fi de dorit să aflăm criteriile pentru a înțelege ceea ce crede că este greșit în "primul a fost trimis, primul sa înscris, etc."

Memorie: 0,78 MB
Durată: 0min