Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Starta och vänta (VB6/VBS)

Postades av 2004-01-07 11:04:14 - ----- -----, i forum visual basic - allmänt, Tråden har 20 Kommentarer och lästs av 595 personer

Jag vill från vb eller vbs starta ett program eller en bat-fil och vänta tills exekveringen är färdig och programmet är avslutat, innan jag går vidare i koden. Någon som har ett bra tips?


Svara

Sv: Starta och vänta (VB6/VBS)

Postades av 2004-01-07 11:11:04 - Sven Åke Persson

Enl denna principlösning är en av metoderna
<code>
Dim ret As Long

ret = Shell("C:\Windows\NotePad.exe",vbNormalFocus)
Do Until ret <> 0
DoEvents
Loop
</code>


Svara

Sv: Starta och vänta (VB6/VBS)

Postades av 2004-01-07 11:25:01 - Alexander Zetterlund

Kommer ret att kunna uppdatera sig?


Svara

Sv: Starta och vänta (VB6/VBS)

Postades av 2004-01-07 11:55:53 - Sven Åke Persson

När programmet är färdigstartat kommer ret att innehålla ProcessId för
det startade programmet dvs <> 0 och loopen bryts programmet går vidare.

Ev får du sätta ret = 0 direkt efter ifall du skall öppna fler prog på detta vis.


Svara

Sv: Starta och vänta (VB6/VBS)

Postades av 2004-01-07 12:02:40 - Jan Bulér

Här kanske du kan få en idé.
vbnet.mvps.org/faq/main/waitforsingleobject2.htm

//
Janne


Svara

Sv: Starta och vänta (VB6/VBS)

Postades av 2004-01-07 16:25:22 - Oskar Johansson

SvenPon: Om jag förstår rätt så skulle din kod alltså starta programmet och sedan när programmet var startat så skulle koden fortsätta? Problemet är ju att loopen i så fall är onöig eftersom att vb inte kommer att fortsätta förrens programmet är startat...


Svara

Sv: Starta och vänta (VB6/VBS)

Postades av 2004-01-07 16:30:11 - Sven Åke Persson

>onöig eftersom att vb inte kommer att fortsätta förrens programmet är startat...

Har du lässvårigheter ?

> Jag vill från vb eller vbs starta ett program eller en bat-fil och vänta tills exekveringen är färdig

Skrev frågeställaren.!

Enl honom så vill han att VB skall göra halt i programkörningen tills Shell kommandot
är utfört. Tycker att Jan:s lösning är mycket proffsigare än min gamla Vb 3 lösning.


Svara

Sv: Starta och vänta (VB6/VBS)

Postades av 2004-01-07 19:31:23 - Oskar Johansson

>>onöig eftersom att vb inte kommer att fortsätta förrens programmet är startat...

>Har du lässvårigheter ?

Nej, jag har inga lässvårigheter... Du skrev:

>>
När programmet är färdigstartat kommer ret att innehålla ProcessId för
det startade programmet dvs <> 0 och loopen bryts programmet går vidare.

Ev får du sätta ret = 0 direkt efter ifall du skall öppna fler prog på detta vis.
<<

Dvs. när programmet har startats så kommer ret att innehålla processid... Problemet är ju bara att loopen har ingen som helst funktion eftersom att ret aldrig kommer att ändras efter anropet... Sluta gapa så dant... Enda möjligheten för loopen att köras är om försöket att starta programmet misslyckas, då får du 0 (iaf. med shellexecute), och då kommer loopen att gå i all oändlighet...


Svara

Sv: Starta och vänta (VB6/VBS)

Postades av 2004-01-08 00:14:43 - Sven Åke Persson

Uppriktigt sagt, jag förstår inte vad du svamlar om.
<code>
Option Explicit
Private Sub Command1_Click()
Dim ret As Long
ret = Shell("C:\Windows\NotePad.exe", vbNormalFocus)
Do Until ret <> 0
DoEvents
Loop
MsgBox "NotePad har startat Ok jag kan gå vidare med min Vb code"
End Sub
</code>


Svara

Sv: Starta och vänta (VB6/VBS)

Postades av 2004-01-08 10:15:50 - Jan Bulér

Sven.

Med din lösning så kommer Msg-Boxen upp när Notepad har startats men enligt original frågan så ska den visas när Notepad har körts färdigt (avslutats).

Ett sätt att få till den funktionen på är

<code>
Option Explicit

Private Declare Function OpenProcess Lib "kernel32" _
(ByVal dwDesiredAccess As Long, _
ByVal bInheritHandle As Long, _
ByVal dwProcessId As Long) As Long

Private Declare Function GetExitCodeProcess Lib "kernel32" _
(ByVal hProcess As Long, lpExitCode As Long) As Long

Private Declare Function CloseHandle Lib "kernel32" _
(ByVal hObject As Long) As Long

Private Const PROCESS_QUERY_INFORMATION = &H400
Private Const STATUS_PENDING = &H103&


Private Sub main()

Dim hProcess As Long
Dim ProcessId As Long
Dim exitCode As Long

ProcessId = Shell("notepad.exe", vbNormalNoFocus)
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, ProcessId)

Do
Call GetExitCodeProcess(hProcess, exitCode)
DoEvents
Loop While exitCode = STATUS_PENDING

Call CloseHandle(hProcess)

MsgBox "'Shell'-programmet har avslutats."


End Sub
</code>

//
Janne


Svara

Sv: Starta och vänta (VB6/VBS)

Postades av 2004-01-08 12:56:58 - Sven Åke Persson

>Med din lösning så kommer Msg-Boxen upp när Notepad har startats men enligt
>original frågan så ska den visas när Notepad har körts färdigt (avslutats).

Ok kanske lite "massuppfittning" Men följande tankeexperiment MittDok är 5 MB
<code>
Dim ret As Long
ret = 0
ret = Shell("C:\Program\Micrsoft Office\WinWord.exe MittDok.doc", vbNormalFocus)
Do Until ret <> 0
DoEvents
Loop
MsgBox "Nu är MittDoc laddat"
End Sub
</code>
Dvs När Word har laddat MittDok (kanske 3-4 sek) så blir ret <> 0 Eller ?


Svara

Sv: Starta och vänta (VB6/VBS)

Postades av 2004-01-08 16:53:16 - Jan Bulér

Nja,

ret får ju sitt värde när raden
<code>ret = Shell("C:\Program\Micrsoft Office\WinWord.exe MittDok.doc", vbNormalFocus)</code>körs.

ret blir <> 0 om Shell-kommandot lyckas när du senare i koden kör
<code>
Do Until ret <> 0
DoEvents
Loop
</code>
Så gör du egentligen bara en koll om Shell-lyckades eller inte. Det är inte så att ret först är 0 och sen när ditt dokument laddats ändrar sig till <> 0 utan ret får sitt värde just när raden med shellkommandot exekveras och shell-kommandot körs normalt asynkront och det är därför VB programmet fortsätter direkt.

Som du skrivit ditt exempel så är det egentligen ingen skillnad från följande
<code>
If ret <> 0 Then
DoEvents
End If
</code>förrutom att om Shell-kommandot misslyckas, ret=0, i ditt fall så hamnar du i en evighetsloop med ditt Do Until

//
Janne



Svara

Sv: Starta och vänta (VB6/VBS)

Postades av 2004-01-08 17:09:32 - Sven Åke Persson

<förrutom att om Shell-kommandot misslyckas, ret=0, i ditt fall så hamnar du i en <evighetsloop med ditt Do Until

Mmm.... Det här är ju inget jag hittat på utan kommer från gamla experters Tips o Trix
Som du förstår så håller jag med om att din lösning är proffsigare.

beträffande felhantering så kan du ju alltid komma ur loopen eftersom DoEvents finns
jag utgick från att den skulle lyckas. Klart att man måste hantera Error.

"If the Shell function successfully executes the named file, it returns the task ID of the
started program. The task ID is a unique number that identifies the running program.
If the Shell function can't start the named program," *an error occurs*.

Jag hävdar att om i mitt exempel det tar 10 sek att ladda Worddokumentet
så kommer ret inte bli <> 0 förrän efter 10 sek .
Så uppfattade jag att frågeställaren ville ha det.


Svara

Sv: Starta och vänta (VB6/VBS)

Postades av 2004-01-08 21:05:22 - Oskar Johansson

Om det tar 10 sek att ladda programmet så kommer inte shell att fortsätta förrens efter 10 sek

Alt. att programmet kommer att fortsätta ändå, men loopen kommer aldrig att köras...

Kan du förklara hur in i sjutton ret skulle kunna få ett nytt värde när den sitter i loopen och kör?


Svara

Sv: Starta och vänta (VB6/VBS)

Postades av 2004-01-08 21:31:39 - Niklas Jansson

Helt säker kan man inte vara i VB, eftersom referenser döljs på ett helt annat sätt än i andra språk. Vad gäller just tilldelningar är jag dock tämligen säker på att det bara sker just en gång.

Men betänk följande:
Du har ett WinAPI-anrop (eller något annat externt), vi kallar den X, som tar en pekare till en Long (den Long som finns i VB).
Någon har gjort en wrapper till detta anrop. Vi kan kalla wrappern för Y.

Y har en inparameter som är ByRef och av typen Long, vi kallar den Z. Y skickar nu adressen av Z till X, (kanske gör något mer, det är oväsentligt) och avslutar sig själv.

Hur har X använt den Long som skickades in?
Det kan vara så att X kommer att behålla adressen till Z, och sedan ändra den när något har inträffat, eller vid ett annat API-anrop, osv.

Z kommer då hamna i ett s.k. "volatile-läge", man vet bara dess värde just när man kollar i den.

I t.ex. C/C++ finns ett speciellt nyckelord (volatile) för sådana variabler.

Det kan alltså (åtminstone teoretiskt) vara så att båda If-satserna nedan kommer att utföras (men det sker naturligtvis mycket sällan).

If a=1 Then
'Gör sak 1
End If

If a=2 Then
'Gör sak 2
End If

Men som sagt: I det här fallet verkar det mycket orimligt.


Svara

Sv: Starta och vänta (VB6/VBS)

Postades av 2004-01-08 21:33:49 - Oskar Johansson

Hm... Den får ju ingen referens till variabeln, vb tar ju bara emot värdet och kopierar det till ret? Eller? Så om den skulle få tag på en minnesadress så skulle det ju inte vara adressen till ret ju...


Svara

Sv: Starta och vänta (VB6/VBS)

Postades av 2004-01-08 21:45:07 - Niklas Jansson

Nej, jag säger ju det. I det här fallet är det förmodligen inte så (även om VB skulle kunna ha en del hyss för sig man inte märker).

Om man istället hade haft något i stil med:

Set A = Funktion(Argument)

Så hade samma sak kunnat hända.


Svara

Sv: Starta och vänta (VB6/VBS)

Postades av 2004-01-08 22:16:32 - Oskar Johansson

Då ja, men en long är en long... ;) Och jag tror inte att vb göra sådana saker... har inte hört talas om det iaf... :)


Svara

Sv: Starta och vänta (VB6/VBS)

Postades av 2004-01-09 01:10:45 - Sven Åke Persson

>Kan du förklara hur in i sjutton ret skulle kunna få ett nytt värde när den sitter i loopen och kör?
Nej


Svara

Sv: Starta och vänta (VB6/VBS)

Postades av 2004-01-09 10:57:09 - Sven Åke Persson

Jag kommer nog ihåg fel. Får ta fram mina "Dödahavsrullar" och kolla.
Det handlade om simulerad multitasking där den ena processen väntade
tills den andra blev True. Man löste det med Do Loopar och DoEvents.


Svara

Sv: Starta och vänta (VB6/VBS)

Postades av 2004-01-09 16:54:56 - Oskar Johansson

Det där med loopen stämmer nog, men du måste anropa ett api däri också där du sätter ret till resultatet utav det...


Svara

Nyligen

  • 18:42 Hvor finder man håndlavede lamper
  • 18:41 Hvor finder man håndlavede lamper
  • 16:36 Allt du behöver veta om keramiskt
  • 16:14 Vem anlitar man egentligen när tak
  • 16:14 Vem anlitar man egentligen när tak
  • 16:13 Vem anlitar man egentligen när tak
  • 11:52 Noen erfaring med uttak hos Mostbe
  • 11:51 Noen erfaring med uttak hos Mostbe

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 570 557
27 958
271 741
456
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies