5 Stimmen

Delegat im Hauptthread einer Konsolenanwendung aufrufen

Wenn in einer Windows-Anwendung mehrere Threads verwendet werden, weiß ich, dass es notwendig ist, den Hauptthread aufzurufen, um die GUI-Komponenten zu aktualisieren. Wie wird dies in einer Konsolenanwendung durchgeführt?

Ich habe zum Beispiel zwei Threads, einen Haupt- und einen Nebenthread. Der sekundäre Thread wartet immer auf einen globalen Hotkey; wenn dieser gedrückt wird, führt der sekundäre Thread ein Ereignis aus, das die win32 api-Methode AnimateWindow erreicht. Ich erhalte eine Fehlermeldung, weil nur der Haupt-Thread diese Funktion ausführen darf.

Wie kann ich dem Hauptthread effektiv sagen, dass er diese Methode ausführen soll, wenn "Invoke" nicht verfügbar ist?


aktualisieren: wenn es hilft, hier ist der Code. Um das HotKeyManager-Zeug zu sehen (wo der andere Thread ins Spiel kommt), sehen Sie sich die Antwort auf diese Frage

class Hud
{
    bool isHidden = false;
    int keyId;

    private static IntPtr windowHandle;

    public void Init(string[] args)
    {
        windowHandle = Process.GetCurrentProcess().MainWindowHandle;
        SetupHotkey();
        InitPowershell(args);
        Cleanup();
    }

    private void Cleanup()
    {
        HotKeyManager.UnregisterHotKey(keyId);
    }

    private void SetupHotkey()
    {

        keyId = HotKeyManager.RegisterHotKey(Keys.Oemtilde, KeyModifiers.Control);
        HotKeyManager.HotKeyPressed += new EventHandler<HotKeyEventArgs>(HotKeyManager_HotKeyPressed);
    }

    void HotKeyManager_HotKeyPressed(object sender, HotKeyEventArgs e)
    {
       ToggleWindow();
    }

    private void ToggleWindow()
    {
        //exception is thrown because a thread other than the one the console was created in is trying to call AnimateWindow

        if (isHidden)
        {
            if (!User32.AnimateWindow(windowHandle, 200, AnimateWindowFlags.AW_VER_NEGATIVE | AnimateWindowFlags.AW_SLIDE))
                throw new Win32Exception(Marshal.GetLastWin32Error());
        }
        else
        {
            if (!User32.AnimateWindow(windowHandle, 200, AnimateWindowFlags.AW_VER_POSITIVE | AnimateWindowFlags.AW_HIDE))
                throw new Win32Exception(Marshal.GetLastWin32Error());
        }
        isHidden = !isHidden;
    }

    private void InitPowershell(string[] args)
    {
        var config = RunspaceConfiguration.Create();
        ConsoleShell.Start(config, "", "", args);
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X