|
-
Dec 11th, 2006, 12:48 PM
#1
Thread Starter
New Member
SOLVED: Is simulated multithreading the way to go (for what i need to do)?
First off, let me say I'm an experienced programmer, but I'm still reorienting myself with VB which I hadn't touched in some time.
I'm writing an app with a heavy-duty function call that takes about 5 minutes to complete (processing a list of files inside a loop). What happens is, the user clicks "Start" which triggers said function, and the program (predictably) becomes unresponsive until the function completes. What i'd like, however, is for the user to still be able to move the window or at least click a Cancel button if they need to abort it (the function itself is primarily a loop, so I could add a check at the end of said loop).
Now, I've read the horror stories about simulated multithreading in vb6, so I'm wondering...is there another (better) way?
Last edited by evank; Dec 11th, 2006 at 01:01 PM.
Reason: Issue Solved (Thanks rob!)
-
Dec 11th, 2006, 12:51 PM
#2
Re: Is simulated multithreading the way to go (for what i need to do)?
If you are just doing something in a loop then it may not be a candidate for multithreading.
Do you have a doevents in the loop and a boolean variable flag to signify the breaking out of the loop?
VB/Office Guru™ (AKA: Gangsta Yoda™ ®)
I dont answer coding questions via PM. Please post a thread in the appropriate forum. 
Microsoft MVP 2006-2011
Office Development FAQ (C#, VB.NET, VB 6, VBA)
Senior Jedi Software Engineer MCP (VB 6 & .NET), BSEE, CET
If a post has helped you then Please Rate it! 
• Reps & Rating Posts • VS.NET on Vista • Multiple .NET Framework Versions • Office Primary Interop Assemblies • VB/Office Guru™ Word SpellChecker™.NET • VB/Office Guru™ Word SpellChecker™ VB6 • VB.NET Attributes Ex. • Outlook Global Address List • API Viewer utility • .NET API Viewer Utility •
System: Intel i7 6850K, Geforce GTX1060, Samsung M.2 1 TB & SATA 500 GB, 32 GBs DDR4 3300 Quad Channel RAM, 2 Viewsonic 24" LCDs, Windows 10, Office 2016, VS 2019, VB6 SP6 
-
Dec 11th, 2006, 01:00 PM
#3
Thread Starter
New Member
Re: Is simulated multithreading the way to go (for what i need to do)?
DoEvents is what I was looking for
As I said, still accustoming myself to vb, so chock this one up as a stupid question
-
Dec 11th, 2006, 01:09 PM
#4
Re: SOLVED: Is simulated multithreading the way to go (for what i need to do)?
There are no stupid questions. 
Ask any questions and we will try to help (just create a new thread for anything new )
Glad to have helped.
VB/Office Guru™ (AKA: Gangsta Yoda™ ®)
I dont answer coding questions via PM. Please post a thread in the appropriate forum. 
Microsoft MVP 2006-2011
Office Development FAQ (C#, VB.NET, VB 6, VBA)
Senior Jedi Software Engineer MCP (VB 6 & .NET), BSEE, CET
If a post has helped you then Please Rate it! 
• Reps & Rating Posts • VS.NET on Vista • Multiple .NET Framework Versions • Office Primary Interop Assemblies • VB/Office Guru™ Word SpellChecker™.NET • VB/Office Guru™ Word SpellChecker™ VB6 • VB.NET Attributes Ex. • Outlook Global Address List • API Viewer utility • .NET API Viewer Utility •
System: Intel i7 6850K, Geforce GTX1060, Samsung M.2 1 TB & SATA 500 GB, 32 GBs DDR4 3300 Quad Channel RAM, 2 Viewsonic 24" LCDs, Windows 10, Office 2016, VS 2019, VB6 SP6 
-
Dec 11th, 2006, 01:10 PM
#5
Re: SOLVED: Is simulated multithreading the way to go (for what i need to do)?
You would need to put DoEvents which should execute at regular intervals in your application. However as the normal DoEvents is very slow, just have a look at this link which provides an alternative faster DoEvents function.
Give Time to Other Events in My Application
Pradeep
-
Dec 11th, 2006, 01:45 PM
#6
Re: SOLVED: Is simulated multithreading the way to go (for what i need to do)?
You can speed it up pretty well by using DoEvents only when it is needed. You can use the GetInputState API function for this.
VB Code:
Private Declare Function GetInputState Lib "user32" Alias "GetInputState" () As Long
Do
DoSomething
If GetInputState Then DoEvents
Loop Until Condition = True
There is another (better) API function to use, but I forgot what it is. Hopefully someone remembers and will post it.
-
Dec 11th, 2006, 01:53 PM
#7
Re: SOLVED: Is simulated multithreading the way to go (for what i need to do)?
That is a great API DR but what about mouse moves over the GUI? Wouldnt it not process those and give the locked illusion? Seems the api is only for mouse clicks and keyboard keypresses.
Good tip though
VB/Office Guru™ (AKA: Gangsta Yoda™ ®)
I dont answer coding questions via PM. Please post a thread in the appropriate forum. 
Microsoft MVP 2006-2011
Office Development FAQ (C#, VB.NET, VB 6, VBA)
Senior Jedi Software Engineer MCP (VB 6 & .NET), BSEE, CET
If a post has helped you then Please Rate it! 
• Reps & Rating Posts • VS.NET on Vista • Multiple .NET Framework Versions • Office Primary Interop Assemblies • VB/Office Guru™ Word SpellChecker™.NET • VB/Office Guru™ Word SpellChecker™ VB6 • VB.NET Attributes Ex. • Outlook Global Address List • API Viewer utility • .NET API Viewer Utility •
System: Intel i7 6850K, Geforce GTX1060, Samsung M.2 1 TB & SATA 500 GB, 32 GBs DDR4 3300 Quad Channel RAM, 2 Viewsonic 24" LCDs, Windows 10, Office 2016, VS 2019, VB6 SP6 
-
Dec 11th, 2006, 02:02 PM
#8
Re: SOLVED: Is simulated multithreading the way to go (for what i need to do)?
 Originally Posted by RobDog888
That is a great API DR but what about mouse moves over the GUI? Wouldnt it not process those and give the locked illusion? Seems the api is only for mouse clicks and keyboard keypresses.
Good tip though 
It seems to work for me.
You may have to put a DoEvents right before the loop, not sure.
-
Dec 11th, 2006, 02:10 PM
#9
Re: SOLVED: Is simulated multithreading the way to go (for what i need to do)?
Havent tested it but mostly referring to your gui if you have events that should fire like mouseovers which dont count towards the queue that the api looks at.
VB/Office Guru™ (AKA: Gangsta Yoda™ ®)
I dont answer coding questions via PM. Please post a thread in the appropriate forum. 
Microsoft MVP 2006-2011
Office Development FAQ (C#, VB.NET, VB 6, VBA)
Senior Jedi Software Engineer MCP (VB 6 & .NET), BSEE, CET
If a post has helped you then Please Rate it! 
• Reps & Rating Posts • VS.NET on Vista • Multiple .NET Framework Versions • Office Primary Interop Assemblies • VB/Office Guru™ Word SpellChecker™.NET • VB/Office Guru™ Word SpellChecker™ VB6 • VB.NET Attributes Ex. • Outlook Global Address List • API Viewer utility • .NET API Viewer Utility •
System: Intel i7 6850K, Geforce GTX1060, Samsung M.2 1 TB & SATA 500 GB, 32 GBs DDR4 3300 Quad Channel RAM, 2 Viewsonic 24" LCDs, Windows 10, Office 2016, VS 2019, VB6 SP6 
-
Dec 11th, 2006, 03:46 PM
#10
Re: SOLVED: Is simulated multithreading the way to go (for what i need to do)?
I know it's marked as resolved, but just in case someone is interested in the multithreading option - a little demo program.
As to which is faster, MultiThreading or DoEvents, I'll leave others to argue. The obvious advantage of MultiThreading comes in when you have to perform other tasks within the same app. Make an executable of the code below and run it. Click on "Start MultiThread" and move the form around, scroll the textbox etc. The "AddTextMultiThread" function continues without even a pause. Click on "Stop MultiThread". Try the same with "Start/Stop DoEvents". Spot the difference.
'Original code at:- http://www.free2code.net/plugins/art...read.php?id=94
VB Code:
Option Explicit
'Form level code.
'MultiThread versus DoEvents.
'Add a textbox and 4 command buttons to a form.
Private Declare Function CreateThread Lib "kernel32" (ByVal lpThreadAttributes As Any, _
ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Any, _
ByVal dwCreationFlags As Long, lpThreadID As Long) As Long
Private Declare Function TerminateThread Lib "kernel32" (ByVal hThread As Long, _
ByVal dwExitCode As Long) As Long
Private Sub Command1_Click()
id = CreateThread(ByVal 0&, ByVal 0&, AddressOf AddTextMultiThread, ByVal 0&, 0, id)
End Sub
Private Sub Command2_Click()
Call TerminateThread(id, ByVal 0&)
End Sub
Private Sub Command3_Click()
StopDo = True
AddTextDoEvents
End Sub
Private Sub Command4_Click()
StopDo = False
End Sub
Private Sub Form_Load()
Me.Height = 4545
Me.Width = 8925
Text1.Move 45, 45, 8700, 3525
Command1.Move 45, 3690, 1635, 375
Command1.Caption = "Start MultiThread"
Command2.Move 1845, 3690, 1635, 375
Command2.Caption = "Stop MultiThread"
Command3.Move 5310, 3690, 1635, 375
Command3.Caption = "Start DoEvents"
Command4.Move 7110, 3690, 1635, 375
Command4.Caption = "Stop DoEvents"
End Sub
VB Code:
'Module level code.
Option Explicit
Public id As Long
Public StopDo As Boolean
Public Function AddTextMultiThread()
Do
Form1.Text1.SelText = "Adding to Text1 - "
Loop
End Function
Public Function AddTextDoEvents()
StopDo = True
Do While StopDo = True
Form1.Text1.SelText = "Adding to Text1 - "
DoEvents
Loop
End Function
-
Jan 25th, 2007, 02:44 PM
#11
Re: SOLVED: Is simulated multithreading the way to go (for what i need to do)?
The above code will not work correctly.
The CreateThread API is not supported in VB and will quite often crash your app.
The only method I have seen that is close to tru multithreading in the code contained in the Multithreading link in my sig.
Cheers,
Woka
-
May 2nd, 2008, 02:51 PM
#12
Member
Re: SOLVED: Is simulated multithreading the way to go (for what i need to do)?
Made the form & module with code as supplied, and when compiled (though not in VB) it runs as advertised. Thank you. Very keen bit of code.
_____________________________
. Error Code 34: There is no error .
-
May 2nd, 2008, 06:45 PM
#13
Re: SOLVED: Is simulated multithreading the way to go (for what i need to do)?
Thank you for letting us know that you have your answer. You may find it easier next time however by just pulling down the Thread Tools menu and clicking the Mark Thread Resolved button.
-
May 2nd, 2008, 06:48 PM
#14
Lively Member
Re: SOLVED: Is simulated multithreading the way to go (for what i need to do)?
it seems like people in here know what they're talking about when it comes to multi-threading.
in that case (since this thread is solved), would anyone like to look at my problem involving multi-threading?
http://www.vbforums.com/showthread.php?t=521236
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|