Gui Låser til trods for trådet program.
Hey eksperter...Jeg har et lille "problem" jeg ville se om i kunne hjælpe mig med...
Jeg er i gang med at lave et lille framework til filoverførelse (etvejs PT)... jeg har så for at teste det lige lavet en lille GUI der gør jeg kan sende nogle filer... alt dettegår faktisk forbavsende godt... filerne bliver overført korekt og det hele...
Da der allerede er en hel del kode undlader jeg at poste kode her, istedet har jeg uploaded alt til:
http://code.dotjem.com/
Der er stadig meget kode som endnu ikke er "implementeret"...
Dette drejer sig primært om alle klasser som heder noget med "Comm" i starten, meningen er at disse skal bruges til commandoer... dette kører over en anden port således der bliver data socket og comm socket, der er ikke flere datasocket (som fx med ftp) da de data der skal overføres skal komme "synkront" eller hvad man skal sige... det skal ikke være nogen hemlighed at det skulle munde ud i at blive benyttet til MP3 streaming.
Serveren:
StreamServer.cs - http://code.dotjem.com/Server/StreamServer.cs.txt
Kører 2 tråde ved hjælp af delegates så det er threadpolled og med asunc callback når en tråd terminere. Det er PT kun en ene tråd, nemlig FileServer.... tråden som egentlig benyttes... tråden står og lytter på indkomne connections fra klienter, når det sker opretter den så en handler til en klient, denne er også trådet.
FileStreamClientHandler.cs - http://code.dotjem.com/Server/FileStreaming/FileStreamClientHandler.cs.txt
Det er så handleren, den kører som sagt i en tråd... handleren er den som står for at sende til en klient... dette gør den ud fra en Kø som indeholder de filer der skal sendes i form af en "Pakke" (FileStreamPackage.cs) som igen består af en header (FileStreamPackageHeader.cs) og data frames (FileStreamPackageFrame.cs).
Alle ligger i: http://code.dotjem.com/Server/FileStreaming/Packages/
Denne opdeling har noget at gøre med det fact at det er til streaming osv. vil jeg ikke gå så meget i dybden med med mindre der er spørgsmål til det. Desuden er der vist sket et lille knæk i navngivningen da Pakke måske burde have været det en frame nu er og det pakke nu er skulle bare være filen (ren forståelsesmessigt), men lad os nu ikke hænge os i det.
well... En Frame fra en Filpakke er angivet med ne størelse i byte som en ushort, en frame kan altså maximalt være 65kb. det FileStreamClientHandler.cs så gør er:
kigger på om klientens buffer er åben (denne funktionalitet er PT ikke implementeret, så klient bufferen er altid åben, dette har ikke noget at gøre med de buffere edr ligger i streamsne selv)...
Hvis den er det prøver den at sende data, når den starter på en ny fil sender den først en header og så begynder den at sende frames, en af gangen intil hele filen er overført (en frame har også en header)...
og det er faktisk her omkring det går galt...
jeg har nemlig måtte sætte en Thread.Sleep(10) ind mellem hver gang den skriver en frame, da den ellers låser den GUI som jeg bruger til at sende alle disse filer... en Thread.Sleep(10) fungere fint så længer framestørelsen ikke bliver for stor dog, gør den det låser den igen Gui og jeg må sætte Sleep størelsen op, men dette gør tilsyneladende overførelsen langsommere, og dette er jo ikke hensigtmessigt... (Man kan tydeligt mærke forskel på overførelseshastighed mellem fx 4Kb bloks og 65kb bloks)...
Nedsættelsen i hastigheden hænger jo naturligvis sammen med at der er den Thread.Sleep, da jo mindre frame størelse, betyder flere frames som igen betyder flere sleeps...
Derfor er blok størelsen uden den sleep forholdsvis irellevant (bortset fra at jo stører bloks, jomindre overhead er der)... men så låser gui... og med 10ms kan jeg ikke kommer meget højere end 4Kb så skal jeg øge sleep time, som så igen gør det langsomt...
Så spørgsmålet går på hvordan jeg lige håndtere denne situation...
Det er jo allerede trådet i stor stil... (og tråde der arbejder for meget kan jo godt virke blokerende, men burde ikke være så galt at jeg skal miste overførelses hastighed eller gui funktionalitet alt efter valg... :S)
HELP PLZ
