簡體   English   中英

從另一個線程隱藏/顯示Winforms GUI C#

[英]Hide / Show Winforms GUI C# from another thread

這篇文章是快速顯示/隱藏WinForms GUI C#Way方法的延續,因為在這種情況下它對我不起作用。

我有2個問題:

  • 1是mainAnnounceWindow gui應該開始隱藏,然后在被以下方式調用時:windowStateChange(“ Show”)應該顯示,而windowStateChange(“ Hide”)應該隱藏。 它無法正常運行,因為當我啟動應用程序時,它的可見時間為0.5秒(我看到它閃爍)。 有沒有辦法讓它開始隱藏並且不眨眼半秒鍾。

  • 2是從myThreadHandler(Queue.Work)調用時windowStateChange無法正常工作。

     internal class Program { public delegate void StateCallBack(string varState); public static readonly Announce mainAnnounceWindow = new Announce(); public static readonly Thread myThreadGuiAnnounce = new Thread(showGuiAnnounce); public static readonly Thread myThreadTcpClient = new Thread(threadTcpClient); public static readonly Thread myThreadUdpMonitor = new Thread(threadUdpMonitor); public static readonly Thread myThreadHandler = new Thread(Queue.work); public static void Main() { myThreadGuiAnnounce.Start(); myThreadTcpClient.Start(); myThreadUdpMonitor.Start(); myThreadHandler.Start(); windowStateChange("Hide"); while (true) { Thread.Sleep(1000); } } public static void windowStateChange(string varState) { if (mainAnnounceWindow.InvokeRequired) { mainAnnounceWindow.Invoke(new StateCallBack(windowStateChange), new object[] {varState}); } else { if (varState == "Hide") { mainAnnounceWindow.Hide(); mainAnnounceWindow.TopMost = false; } else { mainAnnounceWindow.Show(); mainAnnounceWindow.TopMost = true; } } } private static void showGuiAnnounce() { mainAnnounceWindow.ShowDialog(); } } 

另一類:

  public class Queue : IDisposable {
 public static void work() {
        while (true) {
            string task = null;
            lock (locker)
                if (tasks.Count > 0) {
                    task = tasks.Dequeue();
                    if (task == null) {
                        return;
                    }
                }
            if (task != null) {
                //MessageBox.Show("Performing task: " + task);
                Program.mainAnnounceWindow.setLogTextBox(task);
                Program.mainAnnounceWindow.setLogTrayTip(task);
                Program.windowStateChange("Show");
                Thread.Sleep(5000); // simulate work...
                Program.windowStateChange("Hide");
            } else {
                wh.WaitOne(); // No more tasks - wait for a signal
            }
        }
    }

}

問題在於:

                Program.windowStateChange("Show");
                Thread.Sleep(5000); // simulate work...
                Program.windowStateChange("Hide");

當我調用Program.windowStateChange(“ Show”);時 從其他線程內部,gui顯示但不完全..就像我可以看到它想要顯示,但事實並非如此。 就像一堆應用程序。 但是,當Thread.Sleep(5000)通過時,應用程序就會隱藏。

呼叫:

                Program.mainAnnounceWindow.setLogTextBox(task);
                Program.mainAnnounceWindow.setLogTrayTip(task);

沒問題。 BaloonTip顯示,只是Gui不能正確顯示。 我做錯了。

哦,當然,我做了一些剪切/粘貼操作,因此可能會錯過一些東西。 如果有必要添加一些內容,請告訴我。

帶着敬意,

憤怒的少年

您的問題是您正在從非ui線程訪問ui對象,這是不允許的。 您需要將代表您要執行的操作的委托傳遞給ui控件之一(也許是表單對象)上的Invoke或BeginInvoke方法。

問題是您的主線程被鎖定,因為您添加了以下代碼:

while (true) { 
    Thread.Sleep(1000); 
} 

這將阻止窗口線程正確接收和處理Windows消息(例如顯示和隱藏)。

您還將要使用mainAnnounceWindow.Show()而不是mainAnnounceWindow.ShowDialog() ,因為這將阻止控件正確返回主線程。 您應該只在Main例程中調用Application.Run(mainAnnounceWindow)

public static void Main()       
{      
    myThreadGuiAnnounce.Start();      
    myThreadTcpClient.Start();      
    myThreadUdpMonitor.Start();      
    myThreadHandler.Start();      

    // Just change your main window's load to hide itself... windowStateChange("Hide");      
    Application.Run(mainAnnounceWindow);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM