Hej, Jag har meckat lite vidare med problemet ovan och tror jag kommit fram till att det är jefligt svårt att få en tråd att vänta på ett event, göra en sak och sedan ställa sig och vänta igen.C# Threading: Mutex sempaforer? Counting semafore? Monitor?
det finns en massa störiga saker i Compact Framework där bland annat det här med Monitorer inte fungerar.
Jag vill att en tråd ska vänta med att göra något tills den får en "notify" (eller Pulse som de kallar det i .NET), utgöra en uppgift, sedan vänta igen på nästa "Pulse". Det går att göra i vanliga Framework, men att göra en Pulse i Compact Framework går dessvärre inte.
Så jag meckar loss lite med semaforer men inser att det kommer lite segt att få samma beteende. Tacksam ifall nån assisterar mig här i tänkandet:
Om jag har en semafor (Mutex är det enda som finns ser det ut som) kan jag direkt vid skapandet av semaforen göra en WaitOne ("ta" den som jag uppfattat det).
När sedan min tråd, som jag vill ska göra en viss operation, ska försöka ta den går det inte för den är redan tagen av "nån".
När semaforen släpps kan min tråd gå vidare (ta semforen), göra vad den ska/operationen... Men sen vad? Om tråden släpper semaforen direkt efter den är klar med sitt kan den ta den direkt igen och sedan står man där med en tråd som utför operationen heela tiden... och det är ju inte bra.
Jag vill egentligen att den ska släppa semaforen, ställa sig o vänta igen. Men hur gör man det?
Ska man ha två trådar som turas om att "äga" olika semaforer?
Hmm, tacksam för lite tips och ideér.
MVHSv: C# Threading: Mutex sempaforer? Counting semafore? Monitor?
Som jag gör nu:
- Main skapar semaforen
- Main tar semaforen, mutex.WaitOne()
- Tråden skapas och startas
- Tråden försöker (i sin Run-metod) att ta samma mutex, form1.mutex.WaitOne()
- Tråden låses (precis som den ska) eftersom Mutex:en är redan tagen.
VId en viss tidpunkt kommer jag få in lite data på en TCP-socket, som ska säga till en MessageHandler att fixa så att Mutex:en släpps av min Main (form1) för att låta min tråd göra något.
Jag försökte alltså något i stil med att MessageHandler:n gör:
form1.mutex.ReleaseMutex()
men (PROBLEM 1) det gick inte för den är inte "ägaren" till mutex:en.
PROBLEM 2 är då detta:
Säg att det hade gått att ReleaseMutex ovan, min tråd kommer då att lossna och genomföra någon operation. Därefter ska den återgå och vänta, precis som innan, tills nästa event/data kommer in.
Men detta kommer inte gå för den har redan Mutex:en och den låses INTE om man nu gör en WaitOne() igen på samma mutex.
Således kan jag inte låsa den igen.
Hur går man tillväga för att lösa detta? För det MÅSTE väl gå att göra? Annars är ju nästan hela trådkonceptet dött tycker man...
Väldigt tacksam ifall jag kan få tips och ideér!
MVH