Laden...

Thread mit [STAThread] kennzeichnen

Erstellt von Ayke vor 16 Jahren Letzter Beitrag vor 16 Jahren 4.251 Views
Ayke Themenstarter:in
643 Beiträge seit 2006
vor 16 Jahren
Thread mit [STAThread] kennzeichnen

Hi

Ich habe folgendes Problem : Ich habe eine 3 Form aus der ich den Text von 2 Textboxen in die Zwischenablage kopieren möchte.

Das mache ich mit dieser Funktion:

Clipboard.SetText(textBox1.Text + " ; " + textBox2);

Leider fuktioniert das nur im Haupthread da der ein STA Thread ist. Wie kann ich ein MTA Thread zu einen STA Thread machen ? Oder wie kann ich Form3 mit STA ausführen ?

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Ayke,

da der Zugriff auf GUI Elemente eh von GUI-Thread aus erfolgen muss, kannst du STA und MTA vergessen. Deine Lösung ergibt sich aus: [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke).

herbivore

Ayke Themenstarter:in
643 Beiträge seit 2006
vor 16 Jahren

Das nützt leider nix.

Für den aktuellen Thread muss der STA-Modus (Single Thread Apartment) festgelegt werden, bevor OLE-Aufrufe ausgeführt werden können. Stellen Sie sicher, dass die Hauptfunktion mit STAThreadAttribute gekennzeichnet ist.

Bekomm trozdem diese exp. Neu erstellte Threads laufen im MTA Modus.

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Ayke,

ok, dann nochmal. Die Anweisung Clipboard.SetText (...) muss im GUI-Thread ausgeführt werden. Wie das geht, steht in dem Link. Und da der GUI-Thread STA ist, kommt die Fehlermeldung dann auch nicht mehr.

herbivore

Ayke Themenstarter:in
643 Beiträge seit 2006
vor 16 Jahren

Ich hab es schon verstanden.

        private void pictureBox2_Click(object sender, EventArgs e)
        {
            Invoke(new MethodInvoker(copy));
        }

        public void copy()
        {
            Clipboard.SetText(textBox1.Text + " ; " + textBox2);
        }

funktioniert leider trozdem nicht.

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Ayke,

aber deinen Main-Thread hast du doch vor dem Main mit [STAThread] gekennzeichnet? Und dein GUI-Thread ist doch dein Main-Thread? Und du hast doch auch nur einen GUI-Thread? Das sollte zumindest alles so sein und wenn ja, müsste es laufen.

herbivore

Ayke Themenstarter:in
643 Beiträge seit 2006
vor 16 Jahren

Der mainthread ist gekenntzeichnet. Der GUI Thread ist der Main Thread. Ich müsste einglich auch nur einen GUI Thread haben, aber ich weiss nicht genau da ich nicht mal weiss wie ich mehre GUI Threads erstellen kann.


using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace IrcWar_Search
{
    static class Program
    {
        /// <summary>
        /// Der Haupteinstiegspunkt für die Anwendung.
        /// </summary>
        ///
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}
49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Ayke,

ein Thread wird im Prinzip schon dadurch zum GUI-Thread, dass er mindestens ein Control erzeugt und das sollte eben nur der Main-Thread tun. Sprich alle Forms und Controls sollten von ein und demselben Thread erzeugt werden.

Wenn alles so ist, wie du sagst, bist du dir sicher, dass die Exception nicht von einer anderen Stelle kommt, wo du kein Invoke benutzt? Oder von einer Stelle, wo du copy ohne Invoke aufrufst?

Im Zweifel lass dir die ThreadId in Main und in copy ausgeben. Diese müssen übereinstimmen, sonst ist noch was falsch.

herbivore

Ayke Themenstarter:in
643 Beiträge seit 2006
vor 16 Jahren

Hi herbivore

Ich habe die Anwenung fast fertig und und wenn ich jetzt alle Controls wieder im selben Thread laufen lassen würde müsste ich die halb neu schreiben. Beim nächsten mal merke ich mir das aber kann ich irgenwie disen Thread in Sta Modus laufen lassen.

Wenn alles so ist, wie du sagst, bist du dir sicher, dass die Exception nicht von einer anderen Stelle kommt, wo du kein Invoke benutzt? Oder von einer Stelle, wo du copy ohne Invoke aufrufst?

Ja da bin ich mir sicher also wird es wohl am ersten Vorschlag von dir liegen.

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Ayke,

alle Controls eines Fenster müssen vom gleichen Thread erzeugt werden. Alle Fenster, die in Beziehung stehen (z.B. Owner) müssen im gleichen Thread laufen. Da ist es besser gleich alle Fenster in einem Thread laufen zu lassen. Sonst gibt es (auch bei der Wartung) nur Probleme.

herbivore