Toon posts:

infite loop die niet vastloopt?

Pagina: 1
Acties:

Verwijderd

Topicstarter
ik werk met visual basic 6 en de velleman k8000 parallele poort interface
ik ken niet zo heel veel van vb,
maar ik wou dus een input van de interface scannen
en wanneer deze hoog wordt een actie starten

probleem is dat als mijn programma liep en ik de ingang set er niets gebeurt
als de ingang geset is als ik mijn prog start doet iet het wel, maar dat is natuurlijk niet de bedoeling

ik dacht aan een loop die altijd waar was (en dat hij de ingang dus eeuwig zou scannen)
maar dan loopt het programma gewoon vast

iemand een idee?

ps hoe moet ik checken of een boolean true is?
1 van deze 3 werkt wel, maar ik wil weten welke :)
-- If a = True Or a = "True" Or a = 1 Then --

  • analog_
  • Registratie: Januari 2004
  • Niet online
if(a)
Tenminste zo ging dat vroeger in VBA :)
editter : maak een boolean die aangeeft wanneer het programma moet stoppen en laat while hierop checken zoiets :
code:
1
2
3
4
5
while(!stoppen){
if(jemoetnustoppen) {
stoppen = 1;
}
}

[ Voor 67% gewijzigd door analog_ op 31-01-2007 22:21 ]


  • Flapp
  • Registratie: December 2004
  • Laatst online: 20-05-2024
kan je niet gewoon while(true) doen?

aangezien als je bijv while(a=b) doet en a en b gelijk zijn, dan geeft hij volgens mij als output dus true
dus komt het op het zelfde neer als while(true)

Correct me if i'm wrong :X

[ Voor 75% gewijzigd door Flapp op 31-01-2007 22:41 ]

"Stilte, een gat in het geluid...."


Verwijderd

Topicstarter
ik deed nu while c=c
en dan loopt mijn pc vast

ik zoek dus een manier om die poort niet eenmaal te scannen
maar continu tot ze geset wordt

[ Voor 50% gewijzigd door Verwijderd op 31-01-2007 22:29 ]


  • Flapp
  • Registratie: December 2004
  • Laatst online: 20-05-2024
doe eens while(true) ?

lees:
Visual Basic 6:
1
2
3
do while(true)
{wat je wil dat er word uitgevoerd}
loop



Update:
Het nadeel van deze manier lees ik net: is dat je gewoon in een infinite loop blijft zitten en hij ook niets anders kan doen.

In principe zou je iets van

code:
1
2
3
do while(geeninputontvangen)
{en dan een code die iets doet als je input ontvangt en geeninputontvangen op false zet}
loop


het nadeel is alsnog dat je niets kan doen totdat er input is ontvangen

[ Voor 133% gewijzigd door Flapp op 31-01-2007 22:47 ]

"Stilte, een gat in het geluid...."


Verwijderd

Topicstarter
ik heb iets gevonden dat werkt
in de trend van een lus die stopt als de voorwaarde voldaan is
maar nu verschijnt mijn form wel pas daarna, wat ook weer niet de bedoeling was

dit zou het moeten zijn:
ik zit in form 1
-> ga naar form 2 en poort wordt gescand (er gebeurt niets speciaals als de vor waarde voor het stoppen met scannen voldaan is , enkel stoppen met scannen)

dit gebeurt er:
ik zit in form 1
->wil naar form 2 gaan, maar het scherm valt weg en het scherm met form 2 komt pas als de voorwaarde voor het stoppen met scannen voldaan is

  • xtra
  • Registratie: November 2001
  • Laatst online: 19-11 10:57
Met While(True) gaat VB heel hard proberen dat eindeloos uit te voeren met als gevolg dat je PC vrijwel niet meer reageert.
Zet in je while-loop een DoEvents zodat er gekeken wordt of er nog gebruikersinvoer etc. is.

  • Flapp
  • Registratie: December 2004
  • Laatst online: 20-05-2024
offtopic:
tja voor mij is VB al een tijdje geleden, maar in php is een ranzige manier voor raw sockets gewoon een loop met while(true) en dan iedere keer kijken of er al nieuwe data binnen is. :X

"Stilte, een gat in het geluid...."


Verwijderd

Topicstarter
Flapietoetoe schreef op woensdag 31 januari 2007 @ 22:41:

het nadeel is alsnog dat je niets kan doen totdat er input is ontvangen
idd en van dat nadeel zou ik nog graag vanaf ;)

  • Flapp
  • Registratie: December 2004
  • Laatst online: 20-05-2024
Tja daarvoor is mijn VB iets te roestig :P
ik zal wel eens even voor je googlen, al kan je dat natuurlijk ook zelf :+
maar als je voor je zelf iets opzoekt lukt t nooit, dat probleem heb ik ook wel eens.

"Stilte, een gat in het geluid...."


  • djexplo
  • Registratie: Oktober 2000
  • Laatst online: 27-10 15:31
De parallel en seriel poorten zijn gebufferd (misschien moet je het wel aan zetten), dus realtime uitlezen er van is niet nodig. Je kan beter een timer gebruiken die elke 100ste van een seconde een functie aanroept die de port checkt, dan een loop die 100% CPU gaat rekken

'if it looks like a duck, walks like a duck and quacks like a duck it's probably a duck'


Verwijderd

Topicstarter
dat de cpu in het rood gaat is nu even niet zo erg ;)
het is wel belangrijk dat het form ervoor verschijnt, want daar staat wat ze moeten doen
en hoe de cpu terug rust krijgt

Verwijderd

DoEvents (is al genoemd).

Dat is precies wat je wil, dan kan je programma rustig loopen terwijl de rest van de PC netjes z'n messages verwerkt.

En wat betreft het stoppen van de loop als je het programma sluit:

Gewoon even een End in de close event van de mainform zetten, dat helpt em wel om zeep ;)

Tis allemaal een beetje ranzig, maar in VB is het zo makkelijk ranzig te werken :D

[ Voor 46% gewijzigd door Verwijderd op 31-01-2007 23:06 ]


Verwijderd

Topicstarter
ik geraak er niet uit met doevents, nu wil er niets meer werken

om het nog concreter te maken:
het is de code voor een lichtsluis (bestaande uit 2 stralen)
als onderbroken wordt, wordt a of b geset
en dan wordt er een alarm gestart

alvast bedankt voor jullie hulp!

Private Sub lichtsluis()
Dim a, b, c As Boolean
ConfigIOchipAsInput (0)
ConfigIOchipAsOutput (1)
Do
a = ReadIOchannel(1)
b = ReadIOchannel(2)
If a = 1 Or b = 1 Then
SetIOchannel (16)
End If
c = ReadIOchannel(16)
Loop Until c = 1

  • Nijn
  • Registratie: Januari 2005
  • Laatst online: 30-11 19:05
Waarom gooi je `m niet gewoon in een timer?
Dan laad je form gewoon en krijgt je pc ook wat tijd om op adem te komen.

Of zeg ik nou wat raars :S

Overigens, je form verschijnt niet omdat je deze sub start voordat je form op het scherm verschijnt. Dan blijft ie wachten totdat deze sub is afgesloten. Roep hem aan vanuit een form1.activate (dacht ik) en je form verschijnt gewoon.

Verander hem vervolgens naar

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
Private Sub lichtsluis()
Dim a, b, c As Boolean
ConfigIOchipAsInput (0)
ConfigIOchipAsOutput (1)
Do 
doevents:doevents:doevents
a = ReadIOchannel(1)
b = ReadIOchannel(2)
If a = 1 Or b = 1 Then
SetIOchannel (16)
End If
c = ReadIOchannel(16)
Loop Until c = 1


zodat je pc wat op adem kan komen.

[ Voor 67% gewijzigd door Nijn op 31-01-2007 23:33 ]


Verwijderd

Topicstarter
werkt! :p
komt dat nu vooral door die 3*doevents (waarom 3* trouwens?)
of omdat ik de procedure aanroep via activate (denk dit laatste :))

enorm bedankt allemaal!!!
ik had dit eigenlijk niet verwacht, echt fijn

morgen sta ik hier wss terug met een aantal vragen...

groeten, kr!z

Verwijderd

Volgens mij moet je niet het activate event hebben maar het onshow event, onactivate triggert iedere keer als het ding actief wordt, onshow alleen als het geshowed wordt.

Overigens kun je het ook gerust in de onload zetten, je moet dan alleen wel even form.show aanroepen alvorens je loop te starten.

Het heeft overigens geen enkele nut om doevents 3x achter elkaar aan te roepen, 1x is genoeg. (Je geeft dan namelijk aan Windows door dat ie van alle applicaties de message queue moet gaan aflopen. Wanneer alle applicaties geweest zijn ben jij weer aan de beurt.

Door 3x doevents erin te zetten loopt jouw programma 3x trager als alle andere programma's op je PC.

Je kunt wel in een loop meerdere keren doevents aanroepen (bijvoorbeeld wanneer je flink zware dingen doet), maar 3x direct achter elkaar is gewoon nutteloos. Stel je zou hele zware dingen aan het doen zijn dan gaat je PC haperen.

  • ZaZ
  • Registratie: Oktober 2002
  • Laatst online: 27-11 15:14

ZaZ

Tweakers abonnee

Je moet wel OnActivate hebben. OnShow kent VB6 niet en OnActivate wordt niet getriggered als het scherm actief wordt in VB6, want dat is GetFocus.
Je kan ook in je load voor de loop Me.Refresh gebruiken. Tevens, een DoEvents elke iteratie is misschien behoorlijk overkill. En idd, 3 is totaal nutteloos....
End gebruiken met als excuus dat het makkelijk is, is natuurlijk bull.

Lekker op de bank


Verwijderd

ZaZ schreef op donderdag 01 februari 2007 @ 05:08:
Je moet wel OnActivate hebben. OnShow kent VB6 niet en OnActivate wordt niet getriggered als het scherm actief wordt in VB6, want dat is GetFocus.
Je kan ook in je load voor de loop Me.Refresh gebruiken. Tevens, een DoEvents elke iteratie is misschien behoorlijk overkill. En idd, 3 is totaal nutteloos....
End gebruiken met als excuus dat het makkelijk is, is natuurlijk bull.
End gebruiken als excuus omdat het zo lekker ranzig is en onder VB is het altijd makkelijk om ranzig te programmeren (dat wil dus niet zeggen dat end gebruiken makkelijk is).

Ik was inderdaad ff in de war met Form_GotFocus en Form_Activate, het is inderdaad wel activate.
VB6 is dan ook inmiddels al een klassieke taal :P
Pagina: 1