Avatar billede bgo Nybegynder
28. juli 2008 - 11:40 Der er 6 kommentarer og
1 løsning

flertrådet skrivning til samme fil

nybegynderen igen med én af de sjove :D

Jeg er igang med et flertrådet program, hvor flere tråde skal skrive til samme logfil. Det giver naturligvis problemer, da det jo kan ske at disse tråde gerne vil skrive til filen samtidig.

Nu vil jeg jo gerne undgå at skrivninger springes over, så en simpel try-konstruktion vil jo nok ikke være løsningen. Stumpen der skal skrive ser pt. således ud:

Sub Poller()
        Dim core As Integer = currentcore
        For index As Integer = 0 To projects.Length() - 2
            If Not projects(index).GetBegun = 1 Or Not projects(index).GetDone = 1 Then
                projects(index).SetBegun(1)
                projects(index).SetDone(1)
                LogWriter = New StreamWriter(LogFile, True, System.Text.Encoding.UTF8)
                tid = Now()
                LogWriter.WriteLine(timestring + " Core: " + core.ToString + " " + projects(index).GetRealname)
                LogWriter.Close()
                Thread.Sleep(6)
            End If

        Next
    End Sub

Jeg formoder at der skal en try-konstruktion til, men hvordan skal den se ud så jeg får alle skrivninger med i logfilen?
Avatar billede mr_chaos Praktikant
28. juli 2008 - 14:20 #1
Du skal bruge et Mutex til at sikre at der kun er en tråd der er inde i den kritiske kode af gangen.

http://msdn.microsoft.com/en-us/library/system.threading.mutex.aspx

Det ville måske være smart kun at åbne filhandlet en gang og så genbruge det, men det er en anden sag
Avatar billede bgo Nybegynder
28. juli 2008 - 14:50 #2
hmm. ser ud til jeg så skal starte fra bunden af igen, så...

under alle omstændigheder går jeg ret hurtigt i stå ved main. Jeg har iforvejen

<STAThread()> _
    Public Shared Sub Main

og ifølge eksemplet skal jeg have en

<MTAThread> _
    Shared Sub Main

kan jeg blot udskifte STAThread() med MTAThread? Altså selvfølgelig ikke alene, men vil dén udskiftning alene medvirke at jeg fortsat får det ud af resten af koden som jeg gør nu? Hvis dét er tilfældet, så skulle det vel være rigeligt at nuppe kode-delen med logskrivningen ud i sin egen sub, og benytte noget .waitone, korrekt?
Avatar billede mr_chaos Praktikant
28. juli 2008 - 15:11 #3
Dete eneste du skal gøre er at lave et mutex

Private Shared mut As New Mutex()

Og derefter bare kalde WaitOne of Release på dit mutex
        ' Wait until it is safe to enter.
        mut.WaitOne()

        ' Smid kode her

        ' Release Mutex.
        mut.ReleaseMutex()
Avatar billede arne_v Ekspert
28. juli 2008 - 15:15 #4
VB.NET har SyncLock keyword til nemt at synkronisere.

Og performance vil uden tvivl vaere bedre ved at holde filen aaben.

Og jer er skeptisk overfor om du faktisk behoever MTAThread - ingen normal app
boer have brug for det.
Avatar billede bgo Nybegynder
28. juli 2008 - 15:30 #5
arne_v:

mht. MTAThread, så må jeg erkende at jeg ikke aner hvad det står for og hvad forskellen på dét og STAThread() er - men i eksemplet på msdn er det MTAThread der bruges :)

mr_chaos:

jeg afprøver lige nogle gange for at se om jeg får nogen "clashes"
Avatar billede arne_v Ekspert
28. juli 2008 - 15:47 #6
MTAThread er noget COM halloejsa - saa vidt jeg har forstaaet saa skal du bruge
det hvis din kode skal kalde COM komponenter som kraever den attribut.
Avatar billede bgo Nybegynder
28. juli 2008 - 15:50 #7
arne_v:

ah, ja, det er jo ikke ligefrem tilfælde for mit program :) Jeg prøver lige med STAThread() igen :)
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
Kategori
Kurser inden for grundlæggende programmering

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