Avatar billede keepy Seniormester
16. januar 2017 - 08:10 Der er 8 kommentarer og
1 løsning

Tråd styring

Hej
Hvordan organiser man sigt program best, for ikke at havne i tråd problemer ? Jeg syntes tit det opstår ved et program der anvender kommunikation til anden hardware eller software, og så ender jeg altid ud med en crappy løsning.

Hvordan gør i andre dette?
Avatar billede arne_v Ekspert
16. januar 2017 - 14:06 #1
Den bedste maade at styre traade paa er at undgaa behovet for at styre traade.

:-)

Hvis det kan klare problemstillingen (hvilket det ofte men ikke altid kan) saa:
- lav thread pool med queue
- submit tasks til queue
- serielle tasks haandteres ved at et task som det sidste submitter naeste task
- al relevant kode skrives traadsikker saaledes at der kan kan kaldes metoder paa samme instans fra forskellige traade og resultat er garanteret korrekt
Avatar billede arne_v Ekspert
18. januar 2017 - 02:30 #2
Har du en specifik problem-stilling i tankerne?

Ovenstaaende er "best case".

"Worst case" er lock, Wait og Pulse*.

Men der er en del muligheder midt imellem.
Avatar billede keepy Seniormester
20. januar 2017 - 21:20 #3
Jeg syntes bare nogle gange at man havner i en situation hvor det ender op i tråd problemer. f.eks. hvis et program anvender flere enheder sat til USB porten og kommunication mellem programmer.
Avatar billede arne_v Ekspert
21. januar 2017 - 06:32 #4
Hvis der skal tilgaaes en ekstern resource som ikke kan bruges samtidigt, saa skal man synkronisere al adgang til denne. Typisk vil man nok bruge lock { } i de relevante metoder.
Avatar billede arne_v Ekspert
21. januar 2017 - 06:33 #5
Med hensyn til kommunikation mellem processer, saa foretraekker jeg normalt en enkelt read traad og synkronisering af writes.
Avatar billede keepy Seniormester
21. januar 2017 - 23:44 #6
ok
Hvis vi lige tog et eksempel.

En DLL sender events til en klasse i et winforms program.
Disse events sørger for at vi får udført en række operationer i en switch/case skruktur.

switch(events)
{
case event1
Write/read fra Com port via dll
Opdater form/gui med de data der er hentet
break;
case event2
Hent data via en service
Opdater form/gui log
break;
case event3
Gem data i en database
Opdater form/gui log
break;
}

Hvordan ville denne skulle gribes an ?
Lave en backgroundworker der tog sig af det hele?
Avatar billede arne_v Ekspert
22. januar 2017 - 19:54 #7
Det er svaert at designe en loesning med saa faa oplysninger.

Men lidt brainstorming:
* app main traad som ikke laver noget
* GUI event traad som er givet
* en reader traad til at laese events
* en threadpool
* reader thread sender tasks til threadpool
* tasks laver det de skal og opdaterer GUI via Invoke (som faar opdatering udfoert i event traad)
* klassen for COM port synkroniserer
* klassen for service interaction laves stateless
* klassen for database interaction laves stateless (hen ny connection, udfoer og luk igen)
Avatar billede keepy Seniormester
23. januar 2017 - 11:11 #8
Ja det er selvfølgelig svært, det var også bare et tænkt eksempel.
Det er en fin opdeling, havde jeg skulle lave det var min tanke nok kun på en tråd mere end gui, men jeg tror du har ret med at en bedre opdeling giver mere styr og bedre resultat.
Avatar billede keepy Seniormester
23. januar 2017 - 13:01 #9
Tak for dine svar det var meget givtigt
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester