/ Forside / Teknologi / Udvikling / Delphi/Pascal / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Delphi/Pascal
#NavnPoint
oldwiking 603
jrossing 525
rpje 520
EXTERMINA.. 500
gandalf 460
gubi 270
DJ_Puden 250
PARKENSS 230
technet 210
10  jdjespers.. 200
Spørgsmål til Semaphor.
Fra : SpookiePower


Dato : 12-01-03 19:58

Her er lidt af den kildekode jeg prøver at finde ud af

hSem := CreateSemaphore(nil, 1, 1, nil);

if WaitForSingleObject(hSem, INFINITE) = WAIT_OBJECT_0 then
begin
køre en procedure......
ReleaseSemaphore(hSem, 1, nil);
end;



Har jeg ret i at = WAIT_OBJECT_0
betyder at, objektet skal være signal, altså = >1 for at få adgang. ?


Betyder INFINITE at tiden ikke går, når der står et objekt og venter på at komme ind ?
Hvis feks tiden var nævnt i milliSek, ville objektet blive lukket ind når tiden var gået,
uanset om objektet var signaled eller non-signaled ?


Når man skriver
CreateSemaphore(nil, 1, 1, nil)
Betyder det første 1-tal (lInitialCount) om objektet fra start skal være signaled eller
non-signaled ??

Jeg fandet denn forklaring på først 1-tal.
The count is decreased by one whenever a wait function releases a thread that was
waiting for the semaphore. The count is increased by a specified amount by calling
the ReleaseSemaphore function.
Betyder denne forklaring at når der bliver lukket et objekt ind, så bliver InitialCount
sat -1, i dette tilfælde betyder det at der ikke er plads til flere objekter inde i proceduren ?
Når objektet så er færdigt inde i proceduren, så bliver den released og InitialCount
bliver +1 = Signaled, så det næste objekt er klar til at komme ind ??

Næste 1-tal(MaximumCount) forstå jeg ikke helt. jeg har fundet denne forklaring -
Specifies the maximum count for the semaphore object. This value must be greater than zero.
Betyder det hvor mange der max må være inde og køre proceduren ?






 
 
Henry (13-01-2003)
Kommentar
Fra : Henry


Dato : 13-01-03 21:33


"SpookiePower" <boxjunk2600@hotmail.com> wrote in message
news:avsdsu$ql4$1@news.cybercity.dk...
> Her er lidt af den kildekode jeg prøver at finde ud af
>
> hSem := CreateSemaphore(nil, 1, 1, nil);
>
> if WaitForSingleObject(hSem, INFINITE) = WAIT_OBJECT_0 then
> begin
> køre en procedure......
> ReleaseSemaphore(hSem, 1, nil);
> end;
Et semaphore object signaleres når der er en "ledig" plads, du kan derfor
f.eks. begrænse antallet af tråde der må afvikles samtidigt.

Jeg ville iøvrigt bruge en try, finally struktur så jeg var sikker på at
releasesemaphore altid blev kaldt.

if WaitForSingleObject(hSem, INFINITE) = WAIT_OBJECT_0 then
try
køre en procedure......
finally
ReleaseSemaphore(hSem, 1, nil);
end;


> Har jeg ret i at = WAIT_OBJECT_0
> betyder at, objektet skal være signal, altså = >1 for at få adgang. ?
Hmmm, jeg jeg tror du misforstår det med WAIT_OBJECT_0. Prøv at se her.

case WaitForSingleObject(hSem, 1000) of
WAIT_OBJECT_0 :
try
køre en procedure......
finally
ReleaseSemaphore(hSem, 1, nil);
end;

WAIT_TIMEOUT : begin
showmessage('Ups timeout');
end;

end;

Her venter jeg på at der skal blive en semaphore "ledig" eller en timeout
(1sek)

> Betyder INFINITE at tiden ikke går, når der står et objekt og venter på at
komme ind ?
> Hvis feks tiden var nævnt i milliSek, ville objektet blive lukket ind når
tiden var gået,
> uanset om objektet var signaled eller non-signaled ?
INFINITE = venter for evigt = laaaaaaang tid


> Når man skriver
> CreateSemaphore(nil, 1, 1, nil)
> Betyder det første 1-tal (lInitialCount) om objektet fra start skal være
signaled eller
> non-signaled ??
>
> Jeg fandet denn forklaring på først 1-tal.
> The count is decreased by one whenever a wait function releases a
thread that was
> waiting for the semaphore. The count is increased by a specified
amount by calling
> the ReleaseSemaphore function.
> Betyder denne forklaring at når der bliver lukket et objekt ind,
Der er kun et object (hSem), dette semaphore object bliver bla. "signaled"
af enten createsemaphore eller releasesemaphore.

så bliver InitialCount
> sat -1, i dette tilfælde betyder det at der ikke er plads til flere
objekter inde i proceduren ?
> Når objektet så er færdigt inde i proceduren, så bliver den released og
InitialCount
> bliver +1 = Signaled, så det næste objekt er klar til at komme ind ??
>
> Næste 1-tal(MaximumCount) forstå jeg ikke helt. jeg har fundet denne
forklaring -
> Specifies the maximum count for the semaphore object. This value must be
greater than zero.
> Betyder det hvor mange der max må være inde og køre proceduren ?
Jeps det er hele idén, skal du derimod begrænse til max 1 så brug en
mutex eller en critical section
Semaphore, når den bliver snuppet i waitforsingleobject bliver tælleren talt
x ned og når den er færdig tælles tælleren x op.

håber det hjælper lidt!
mvh
Henry



SpookiePower (13-01-2003)
Kommentar
Fra : SpookiePower


Dato : 13-01-03 23:15

"Henry" <henry@nn.dk> wrote in message news:3e23223c$0$71616$edfadb0f@dread11.news.tele.dk...

> > Har jeg ret i at = WAIT_OBJECT_0
> > betyder at, objektet skal være signal, altså = >1 for at få adgang. ?

> Hmmm, jeg jeg tror du misforstår det med WAIT_OBJECT_0. Prøv at se her.
>
> case WaitForSingleObject(hSem, 1000) of
> WAIT_OBJECT_0 :
> try
> køre en procedure......
> finally
> ReleaseSemaphore(hSem, 1, nil);
> end;
>
> WAIT_TIMEOUT : begin
> showmessage('Ups timeout');
> end;
>
> end;
>
> Her venter jeg på at der skal blive en semaphore "ledig" eller en timeout
> (1sek)

Jeg kan godt forstå det du skriver, men der er nogle ting jeg ikke kan få
til at hænge sammen. jeg har fundet denne forklaring på -

WAIT_OBJECT_0 (The state of the specified object is signaled)

Som jeg forstår dette, så skal det objekt som vil ind i semaphoren være
signaled. Signaled kan man sætte objektet til, når den bliver created ved brug af -

hSem = CreateSemaphor(x,1,x,x) - Nu er objektet signaled - eller hvad ?

Der er sikkert nogle begreber jeg blander sammen :)





Henry (16-01-2003)
Kommentar
Fra : Henry


Dato : 16-01-03 21:57

> > (1sek)
>
> Jeg kan godt forstå det du skriver, men der er nogle ting jeg ikke kan få
> til at hænge sammen. jeg har fundet denne forklaring på -
>
> WAIT_OBJECT_0 (The state of the specified object is signaled)
>
> Som jeg forstår dette, så skal det objekt som vil ind i semaphoren være
> signaled. Signaled kan man sætte objektet til, når den bliver created ved
brug af -

Ja, WAIT_OBJECT_0 resultatet af WaitForSingleObject når det "første" object
bliver signaleret, du skal måske kikke på WaitForMultipleObjects for at
forstå "WAIT_OBJECT_0".

Når du bruger WaitForMultipleObjects kan din tråd vente på et eller alle
objecter i et array bliver signaleret, ganske handy funktion

Prøv at se sådan på det!
hSem0 := CreateSemaphor(x,1,x,x)
hSem1 := CreateSemaphor(x,1,x,x)
hSem2 := CreateSemaphor(x,1,x,x)
hSem3 := CreateSemaphor(x,1,x,x)
hSem4 := CreateSemaphor(x,1,x,x)
hSem5 := CreateSemaphor(x,1,x,x)

var
hArray := array[0..5] of thandle;

begin
hArray[0] := hSem0;
hArray[1] := hSem1;
hArray[2] := hSem2;
hArray[3] := hSem3;
hArray[4] := hSem4;
hArray[5] := hSem5;

case WaitForMultipleObjects(6,@hArray[0], false, INFINITE) of
WAIT_OBJECT_0 : begin
end;
WAIT_OBJECT_0 +1 : begin
end;
WAIT_OBJECT_0 +2: begin
end;
WAIT_OBJECT_0 +3: begin
end;
WAIT_OBJECT_0 +4: begin
end;
WAIT_OBJECT_0 +5: begin
end;
end;


> Der er sikkert nogle begreber jeg blander sammen :)
jeps

mvh
Henry





Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408924
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste