Hallo liebe Gemeinschaft,
diesmal ist es weniger ein Problem sondern eine Frage.
Ich habe eine sehr große Sub, die sehr lange zur Fertigstellung braucht und welche eigene Variablen besitzt.
Meine Frage ist ob es möglich ist diese Sub mehrmals parallel (also gleichzeitig) laufen zu lassen, oder ob Sie sich gegenseitig mit den Variablen in die Quere kommen.
Ich habe eine sehr große Sub, die sehr lange zur
Fertigstellung braucht und welche eigene Variablen besitzt.
Meine Frage ist ob es möglich ist diese Sub mehrmals parallel
(also gleichzeitig) laufen zu lassen,
nein, VB6 hat nur einen einzigen Programmzeiger. Es kann immer nur ein Befehl ausgeführt werden. Auch wenn du die Prozedur mehrfach startest, bevor sie beendet ist, werden die nicht gleichzeitig abgearbeitet. Du kannst mit Einfügen von DoEvents dafür sorgen, daß die verschiedenen Aufrufe scheinbar etwa gleichzeitig ablaufen, es wird aber trotzdem immer nur ein Befehl ausgeführt. Schneller wird davon nichts.
oder ob Sie sich gegenseitig mit den Variablen in die Quere kommen.
Ja. Das ist der zweite Nachteil. Die Variablen nehmen chaotische Werte an, die verschiedenen Aufrufe beeinflussen sich gegenseitig.
Ich habe eine sehr große Sub, die sehr lange zur
Fertigstellung braucht und welche eigene Variablen besitzt.
Meine Frage ist ob es möglich ist diese Sub mehrmals parallel
(also gleichzeitig) laufen zu lassen,
nein, VB6 hat nur einen einzigen Programmzeiger. Es kann immer
nur ein Befehl ausgeführt werden. Auch wenn du die Prozedur
mehrfach startest, bevor sie beendet ist, werden die nicht
gleichzeitig abgearbeitet.
Hier lege ich mal ein Veto ein Der Fragesteller kann sich beliebig viele Threads anlegen, diese starten und voila hat er das gewünschte
Aber was ich mich gerade frage. Wie soll es gehen das meine eine Prozedur in selben Thread mehrmals zur gleichen Zeit startet? *grübel*
Du kannst mit Einfügen von DoEvents
dafür sorgen, daß die verschiedenen Aufrufe scheinbar etwa
gleichzeitig ablaufen, es wird aber trotzdem immer nur ein
Befehl ausgeführt. Schneller wird davon nichts.
Mit Threads schon
oder ob Sie sich gegenseitig mit den Variablen in die Quere kommen.
Ja. Das ist der zweite Nachteil. Die Variablen nehmen
chaotische Werte an, die verschiedenen Aufrufe beeinflussen
sich gegenseitig.
Ich kann mich nur an einen Source erinnern, welcher VB6
abgeschossen hat als man den Thread startete
Ich bin nun endlich mal dazu gekommen nachzuschauen wie ich es damals gelöst habe. Sicher sind Threads in VB bis zur Version 6 eine heikle Sache, die schon öfters mal VB abstürzen lies, wenn man es falsch gehandhabt hat!
Ich habe es mit folgenden API’s gelöst
einen Thread erzeugen tust du mit der API CreateThread
einen Thread einschläfern tust du mit der APi SuspendThread
Einen thread aufwecken tust du mit der API ResumeThread
Die ThreadPrioritaet tust du mit der API SetThreadPriority festlegen.
Den aktuellen Thread tust du mit der API ExitThread beenden
einen thread von aussen beenden tust du mit der API TerminateThread
Hierbei musst du aber bedenken, das du beim beenden des Proggis auch den Thread beenden tust, sondern schmiert die Deine Anwendung ab. Gerade wenn du Dein Proggi im Step by Step Modus laufen laessen laesst, führt dies zu Problemen. Aber schreibe halt deine Routine und erst wenn du weisst das sie genau das macht was sie soll und du dein Proggi fertig hast, dann packe sie in den Thread und startet ihn dann. So kannst du es gleich danach kompilieren und voila läuft. Sollte dies nicht gehen, so achte peinlich genau darauf das du den Thread beendest, denn sonst schmiert wie gesagt dein VB ab ( Also Project öfters speichern )
Brauchst du den Source, so sage einfach bescheid, dann kopiere ich ihn aus meinem Project von damals raus
PS: Schon einmal überlegt nach .NET umzusteigen? Da sind Threads nun wirklich kein Problem mehr
Ja, mit API-Calls gehts. Bis zu 1000 Threads z.B…
Und wenn die Variablen als privat fürs sub gekennzeichnet sind, bleiben sie das auch. Bei globalen Variablen kommen die Threads natürlich in Konflikt. Man kann aber die globalen Variablen(bzw. Datenobjekte) benutzen, um Threads miteinander kommunizieren zu lassen.
Ich hab das VB5 und ich würde das Threading derselben Sub nur empfehlen, wenn mehrere Prozessoren da sind.
Denn sonst klaut ja ein Sub dem anderen die CPU-Zeit.
Ausprobieren kann man Multithreading aber auch mit einer 1 Kernel CPU.
Und genau, abstürzen wird es zuerst immer wieder, bis man weiß, wie es geht, bzw. wo man es richtig abtippen kann.
Außerdem würd ich sagen, das, wenn es lange dauert, bis ein Sub durch ist, ist da irgendwo ein Fehler. Man könnte auch „Optimierungsbedarf“ sagen. Mehrere Threads von derselben „Sch.“ bringens nicht.
Hallo Alex,
ja ich hab Visual Studio 2005 mit .NET auch compact Framework, aber so richtig gut find ich das nicht. Weil ich keine Art Winsock fürs CF.NET finde.
Ich wäre dir sehr dankbar könntest du mal ein Codebeispiel kopieren!
'Using the CreateThread function in Visual Basic
'is very risky! VB5 is ‚kinda‘ stable, but VB6
'applications will probably crash when you
'use the CreateThread function.