Danke Leute für die ausführliche Aufklärung..!
Hallo,
ich weiss das Thema Thread gab es schon seht oft.
Habe mir den Thread-Faq ([FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke)) durchgelesen und wurde bei einem Punkt nicht schlauer.
Und zwar bei dem.:
Parent-Child-/Owner-Owned-Beziehungen
Wenn man zwei Forms/Controls in eine z.B. Parent-Child-Beziehung zueinander setzt (z.B. durch form1.Controls.Add (textBox1)), müssen beide Forms/Controls im selben Thread erzeugt worden sein. Controls, die in Beziehung stehen, führen untereinander Zugriffe aus und die wären dann fälschlich threadübergreifend, wenn die beiden Forms/Controls in unterschiedlichen Threads laufen würden. Man darf also insbesondere nicht das Form in einem und seine Controls in einem anderen Thread erzeugen. Sinnvollerweise sollte es immer nur einen GUI-Thread geben.
Ich meine Ok klingt alles logisch, aber wie sollte man vorgehen, wenn man in einem Thread ein Control erzeugen möchte, der danach auf der Form geaddet werden soll..?
Geht es überhaupt, oder muss ich nach eine andere Lösung suchen..?
(z.B. den Control in den Haupt-Thread deklarieren)
Leute ich danke euch... das ging ja schneller als ich erwartet hab..!
Ich werde mir alles durch lesen und wenn ich ne weitere Frage hab, werde ich euch wieder nerven..!
-MFG BFK-
Hallo erstmal,
Arbeite in letzter Zeit an sonem kleinem programm in Visual C# und bin auf einem für mich nicht erklärbaren Fehler gestossen.
Mein Problem is folgender..:
Habe eine funktion geschrieben, die verschiedene Berechnungen durchführt, die leider manchmal soviele sind, dass ich auf das ergebniss lange warten muss. Nun habe ich mir überlegt ein Label anzulegen und dessen Text von dieser Funktion aus zu ändern (um so zu wissen wo der Rechner grad mit dem Berechnungen ist, also an welcher Stelle). Hier mal ein kleiner Code-abschnitt zum besseren Verständniss..:
private void function_etwas()
{
label1.Text = "Funktion beginnt mit den Berechnungen (Schritt 1)...";
// ... hier verschiedene Berechnungen
label1.Tect = "Berechnungen vom Schritt 1 fertig, Schritt 2 Berechnung werden durchgeführt";
// ... hier wieder andere Berechnungen u.s.w. u.s.w.
}
Leider funktioniert das obere garnicht und zwar wir der Text vom label1 garnicht geändert. Beim folgendem wird label1.Text auch garnicht verändert..:
private void irgendne_func()
{
label1.Text = "Anderer Text..";
function_etwas();
}
Ich hoffe ich habe mein Prob gut beschrieben..!
Wieso passiert das..?
-MFG Bona-
Erstmal DANKE für deine schnelle Antwort..!
Auf deinen Artikel bin ich auch gestossen, als ich nach einer Lösung für mein Problem gesucht habe.
Nur kann ich mir nicht erklären, wie ich durch linien, rechtecke, kreise, usw. ein schon vorhandenes Bild nachzeichnen kann..?
Deshalb ja "CreateGraphics", weil somit gehts es recht einfach für jemand der von all dem bis jetzt nie in Verbindung gekommen ist..!
Werde mir all das noch gründlicher anschauen..!
"Bona"
Hallo erstmal,
Ich habe folgendes Problem. Habe ein Bild auf meiner Form selbst gezeichnet, also so..:
Graphics g = this.CreateGraphics();
g.Clear(this.BackColor);
Image curImage = Properties.Resources.mein_Bild;
g.DrawImage(curImage, 0, 0, curImage.Width, curImage.Height);
Nun möchte ich diese Zeichnung verschieben können.
Habe mir den folgenden Artikel mal angeschaut Gezeichnete Objekte mit der Maus verschieben, aber leider nicht zu 100 % verstanden.
Ich verstehe nicht wie ich testen soll, dass ich auf ein Object zugreife..?
So wie ich das verstanden hab, speichert progger in seinem Turorial alle gezeichnete Objekte in eine Liste und testet später, was sich grad im hintergrund befindet..!
Wo sollte ich das in meinem Project machen..?
Kann ich eigentlich einen Namen für das gezeichnete Objekt einfügen, damit ich auch sicher bin, dass der Nutzer wirklich dieses Object verschiebt und nicht ein anderes, dass z.B. in der nähe ist..?
Wäre nett, wenn mir jemand das erklären könnte..!
"Bona"
Danke dir mehrmals für deine schnelle Antwort..!
Deine Erklärung klingt logisch.
Der Timer war in meine Gedanken schon als 2. Lösung, allerdings brauche ich dann nicht nach dem 79. Frame zu suchen, sondern gleich nach einer bestimmten Zeit nach dem starten des videos, die mir ja bekannt ist, die pictureBox visible zu machen.
Nur konnte ich mir das mit der MesageBox nicht erklären, aber jetzt ist alles klar..!
Leider gibts es zu wenige funktionen und Events für das shockwavecontrol oder ich kann die nicht finden. Naja egal, auf jeden Fall...
Danke nochmals für deine Antwort..!
"Bona"
Hallo erstmal,
Habe folgendes Problem, bin fast am verzweifeln..:
Habe eine swf-Datei (Adobe Flash Video) in Visual C# eingebunden.
Das Abspielen läuft soweit ohne Probleme.
Ich will aber, dass während des Abspielens (beim 79. Frame) etwas auf der Form passieren soll (es soll eine groupbox namens Player Visible werden).
Mein Code ist folgender...
axShockwaveFlash1.Play();
axShockwaveFlash1.Loop = false;
while (axShockwaveFlash1.Playing)
{
if (axShockwaveFlash1.FrameNum == 79)
{
Player.Visible = true;
}
}
...wobei "axShockwaveFlash1" der Flash Film ist und "Player" die groupbox, die visible werden soll. Dieser Code funktioniert leider nicht. Das programm stürzt gleich ab, ohne irgendein Hinweis auf einen Fehler.
Das komische ist aber, dass wenn ich diesen Code umschreibe, und zwar vor dem if ein MessageBox.Show einfüge, also so...
axShockwaveFlash1.Play();
axShockwaveFlash1.Loop = false;
while (axShockwaveFlash1.Playing)
{
MessageBox.Show("was"); // --- Diese Zeile wurde nur hinzugefügt
if (axShockwaveFlash1.FrameNum == 79)
{
Player.Visible = true;
}
}
...dann funktoiniert dieser Code einwandfrei. Also am 79. Frame erscheint dann die groupbox "Player".
Wieso ist das so..?
Natürlich will ich keine MessageBox an dieser Stelle..!
Ich bitte um jede Hilfe..!
"Bona"