05. februar 2003 - 23:40Der er
20 kommentarer og 2 løsninger
Timer virker ikke....
Davs
Mit problem er at jeg et sted i min kode skal vente på der kommer noget ind på den serielle port, som bruger interrupt. Derfor har jeg lavet en løkke, der fortsætter indtil der kommer noget - Det virker fint. Jeg har nu tilføjet en Timeout, hvis der ikke kommer noget i f.eks. 2 sekunder. Problemet er at når jeg står som for oven, så vil den gerne reagere på com-port interrupt og smutte ud af løkken, men timer-interruptet kommer aldrig. Hvad kan der gøres?.
Private Sub timTimeout_Timer() TimerHit = True End Sub
Så når timeren interrupter, så burde jeg hoppe ud af DoEvents løkken, men timeren kommer slet ikke, da alle ressurcerne er brugt i løkken. Hvis jeg manuelt stepper gennem løkken, så kommer det fint nok, så der får timeren altså en lille smule tid. Det gør den bare ikke real-time.
Et det ikke at starte timeren, og give den et passende interval, fx. 500 millisekunder?
Altså: Når du vil starte din timeout-funktion, der tæller 2 sekunder og derefter afbryder, gfør du følgende:
Gemmer tiden Now i en variabel Enabler timeren Herefter tjekker du Now mod den gemte Now hver gang timeren kører (hvert halve sekund). Sker der i mellemtiden et eller andet, der kræver, at din timer skal starte forfra, gør du det. Sker der derimod ingentind i 2 sekunder, dvs. er forskellen større end 2 sek, disabler du timeren, og gør det der nu skal gøres når der er gået 2 sek...
Går ud fra at det er det du efterspørger... Ovenstående bruger i hvertfald ikke alle ressurser :o)
Problemet er bare, at timeren kører, men interrupter ikke pga. den løkke - Det er fordi at DoEvents overlader ressurcerne til andre programmer, og når det hele tiden gøres, så får timeren ikke lov at køre. Har også prøvet at lave en løkke, der holder kontrollen i programmet, og så hver 10000 gang laver en DoEvent, men stadig ingen timerinterrupt....
Hmmm! - Jeg kan alligevel godt se din ide, hvis man ser helt bort fra timeren. Hvis man istedet i løkken ikke venter på timeren, men bare venter på tiden går ved at tjekke de 2 Now-variable op mod hinanden.
Men er der ikke en måde at give timeren mulighed for bare at virke?.
Ahh - først nu har jeg fattet dit problem. Det, at du står og venter på com-port interrupt optager alle ressurser. Hmmmm - så har jeg bare ideer tilbage: Har ikke forstand på com-port interrupt, men behøver du en løkke med doevents - kan det ikke gøres anderledes? Jeg har desværre ikke nogle guldkorn, men er herefter med på en lytter :o(
COM-port interrupt virker let nok. Hver gang der kommer en character ind fra COM-porten, kommer der et interrupt. Jeg skal så samle disse til en streng, som skal sammenlignes op mod noget andet - Det er sådan et simpelt serielt test-program :-D
Problemet helt basalt er, at jeg arbejder mig igennem nogle filer med disse strenge, og når der i filen står jeg skal modtage et eller andet, så skal jeg det. Jeg står dog der lige midt i en (af måske flere) åbne filer og skal tjekke dette input, og bliver derfor nødt til at vente til det er kommet. Kommer det dog ikke, vil jeg have en timeout. Jeg kan jo ikke bare springe ud af min funktion når jeg venter, da jeg så hver gang jeg får en karakter, skal ind i filen igen, hvilket sikkert godt kan løses, men er noget værre rod (Jeg siger ikke denne løsning er mere køn!). MEN det letteste er hvis jeg bare kan stå det sted i koden, og vente på det kommer ind (Som virker fint fordi det serielle interrupt intet fejler), men skulle der ikke komme noget ind fra COM-porten, så kommer min timeout aldrig, da timeren ikke får lov - Derfor står programmet så mere eller mindre fast...
Compatibility: VB 5.0, VB 6.0 It worked with VB6 but it didn´t compile with VB5 and now it works
Well - Har ikke muligheden for at teste det med tråde lige p.t. men vil kigge på det senere. Havde tråde bare været lige så simple som de er i Java ;-)
Enten : Lad være med at vente i en løkke. Brug MSComm_OnComm Eventet
Eller : Lad være med at bruge timer til at checke for timeout, brug flg. Dim StartTime as Date: StartTime = Now Do DoEvents Loop Until DateDiff("s", StartTime, Now) > 2
20 point til Martin for ideen 10 point til Michael for kildekode der lige var til at paste ind :-)
- Hvad man så gør med sådan en timer er så stadig et problem, men denne løsning virkede fint nok. Man kan godt nok ikke være sikker på at 2 sekunder faktisk er 2 sekunder, men det behøver heller ikke være så præcist i dette tilfælde :-D
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.