Avatar billede bluwduch Nybegynder
05. februar 2003 - 23:40 Der 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?.

Mvh
Daniel-San
Avatar billede naxosnaxos Nybegynder
05. februar 2003 - 23:41 #1
peøv at oprette en seperat tråd.
Avatar billede ocp Nybegynder
05. februar 2003 - 23:50 #2
Husk:
timer.enabled = true
Avatar billede bluwduch Nybegynder
06. februar 2003 - 07:56 #3
Ok - Hvordan gør man det?
(Bare et lille eksempel :-)
Avatar billede bluwduch Nybegynder
06. februar 2003 - 07:57 #4
Timeren er startet :-D
Avatar billede bennytordrup Nybegynder
06. februar 2003 - 08:38 #5
Prøv at kigge på Microsoft Comm Controll. Den er skrevet til det formål.

Jeg har ikke selv prøvet at bruge den - jeg har bare set den og kigget i MSDN.

Jeg går ud fra, at du bruger VB5/6
Avatar billede bluwduch Nybegynder
06. februar 2003 - 08:48 #6
Jep! - Den bruger jeg også, men dens interrupt virker fint. Problemet er den almindelige timer :-D
Avatar billede bennytordrup Nybegynder
06. februar 2003 - 08:49 #7
Sæt en doevents ind i løkken - ellers får programmet ikke tid til at behandle messages andre steder fra.
Avatar billede bluwduch Nybegynder
06. februar 2003 - 09:03 #8
Ok - Jeg beskriver lige situationen p.t.

Jeg står i denne løkke og timeren er startet:

Do
  DoEvents
Loop Until TimerHit = True


Timer-løkken:

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.
Avatar billede martin_moth Mester
06. februar 2003 - 09:18 #9
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)
Avatar billede bluwduch Nybegynder
06. februar 2003 - 09:24 #10
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?.
Avatar billede martin_moth Mester
06. februar 2003 - 09:37 #11
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(
Avatar billede martin_moth Mester
06. februar 2003 - 09:37 #12
PS: Svaret fra naxosnaxos kunne jeg godt tænke mig uddybet :o)
Avatar billede bennytordrup Nybegynder
06. februar 2003 - 09:40 #13
Kan programmet ikke bare stå ledigt mens, det venter på Comm input?
Avatar billede bluwduch Nybegynder
06. februar 2003 - 09:44 #14
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...
Avatar billede ocp Nybegynder
06. februar 2003 - 09:48 #15
Du bliver nok nødt til at gøre det i VB5, da man vist nok ikke kan kalde CreateThread - kig her:

http://www.planet-source-code.com/xq/ASP/txtCodeId.14479/lngWId.1/qx/vb/scripts/ShowCode.htm
Avatar billede bluwduch Nybegynder
06. februar 2003 - 10:03 #16
Hmmm - Taget ud af sammenhængen, men alligevel:

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 ;-)
Avatar billede ocp Nybegynder
06. februar 2003 - 10:36 #17
OK - jeg så bare det modsatte påstået i en anden newsgroup.
Avatar billede bluwduch Nybegynder
06. februar 2003 - 11:49 #18
Alrighty!... Jeg så det i det link du postede :-D
Avatar billede michaelemanuel Nybegynder
06. februar 2003 - 15:24 #19
To løsninger :

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
Avatar billede bluwduch Nybegynder
06. februar 2003 - 19:52 #20
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
Avatar billede bluwduch Nybegynder
06. februar 2003 - 19:52 #21
Forresten...

Tak for hjælpen allesammen :-D
Avatar billede martin_moth Mester
06. februar 2003 - 21:22 #22
Selv tak
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