【问题标题】:Splash Screen on separate thread hides server response单独线程上的启动画面隐藏服务器响应
【发布时间】:2014-05-02 18:25:46
【问题描述】:

我有一个提供 30 天免费试用的 C# Windows 程序。之后,用户必须购买该产品,否则它将被锁定。当程序查询我的网络服务器以查看用户是否正在篡改数据以试图让程序在不购买的情况下运行时,我制作了一个启动屏幕来占用用户。

在我的 Windows 8 机器上(我使用的是 .Net Framework 3.5),启动画面很好地出现,然后 MessageBox 出现(在启动画面的顶部)为他们提供诸如“您的 30 天免费试用”之类的信息还有 2 天”。

然而,在我的 XP 机器上,MessageBox 被闪屏隐藏了。关于如何 SendToFront() MessageBox 或 SendToBack() 启动屏幕的任何想法?如果我只是尝试将初始屏幕上的表单发送到后面,那与将整个线程发送到后面不同。

这是显示启动画面的代码:

static public void ShowSplashScreen() {
    // Make sure it's only launched once.
    if (ms_frmSplash != null)
        return;

    ms_oThread = new Thread(new ThreadStart(SplashScreen.ShowForm));
    ms_oThread.Name = "SplashScreenThread";
    ms_oThread.IsBackground = true;
    ms_oThread.SetApartmentState(ApartmentState.STA);
    ms_oThread.Start();

    while (ms_frmSplash == null || ms_frmSplash.IsHandleCreated == false) {
        System.Threading.Thread.Sleep(TIMER_INTERVAL);
    }
}

【问题讨论】:

  • 一些源代码对诊断您的问题非常有帮助。
  • 您是否从主 GUI 线程运行启动画面和消息框?
  • 我为此使用了codeproject.com/Articles/5454/A-Pretty-Good-Splash-Screen-in-C。它正在从一个单独的线程运行启动画面。我会将 ShowSplashScreen() 的代码添加到原始问题中...谢谢!
  • 您的程序不应使用多个 UI 线程。与其创建第二个 UI 线程然后阻塞原始 UI 线程,不如在原始 UI 线程中显示初始屏幕并在新线程中执行非 UI 工作。

标签: c# screen splash-screen


【解决方案1】:

没有看到你所有的代码,我认为正在发生的事情是这样的: 您在与主​​ GUI 线程不同的线程上运行启动屏幕,然后从主 GUI 线程(或另一个线程)启动消息框。不同线程上的接口将独立(阅读:不规则地)为其 Z 顺序运行。尝试将您的 GUI 元素(启动屏幕和消息框)移动到主线程。在另一个线程上运行所有长时间运行的进程(您的服务器检查)。

【讨论】:

    【解决方案2】:

    好的,我明白 Servy 和 MikeH 在说什么,但我担心的是我做了很多工作,但仍然不起作用。或者,它在机器之间是不可预测的。因此,我将采用的方法是增强启动屏幕,以便它显示来自服务器的结果,而不是在单独的窗口中显示它。这样一来,根本不用担心 Z 排序......

    不过,谢谢你的想法,我以后可能需要它们!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-06
      相关资源
      最近更新 更多