在Console.Read()之后线程卡住了

时间:2016-04-14 01:38:49

标签: c# multithreading forms graphics

我有一个程序可以在提供参数时读取图像,并通过Graphics对象将其呈现给屏幕。它都在一个线程上运行,因为我在主线程上有一个Console.Read()。

PFQuery *query = [PFQuery queryWithClassName:@"YourClass"];
[query whereKey:@"user" equalTo:[PFUser currentUser]];
[query getFirstObjectInBackgroundWithBlock:^(PFObject * yourClass, NSError *error) {
  if (!error) {
    // Found yourClass object
    [yourClass setObject:isInStock forKey:@"isInStock"];

    // Save
    [yourClass saveInBackground];
  } else {
    // Did not find any yourClass object for the current user
    NSLog(@"Error: %@", error);
  }
}];

这是渲染循环:

gw.init();
Thread workerThread = new Thread(new ThreadStart(doRenderLoop));
workerThread.Start();
Console.Read();
running = false;
workerThread.Join();

这是gw.render:

try
  {
      while (running)
      {
           gw.render();
           Thread.Sleep(1000 / 30);
      }
  }
  catch (Exception)
  {
       throw;
  }
}

(顺便说一句,bgColor是Color.BLACK)

从任务经理的说法来看,我的窗户很好。 当我看着我的窗户时,它不会聚焦并保持在无响应的状态。 picture

任何帮助都将不胜感激。

编辑1:我试过Eli的帖子,但仍然没有运气。这是新的渲染循环代码:

wg.Clear(bgColor);
wg.Flush();

我仍然得到相同的结果。并且代码的前3行不在主线程中。

编辑2:所以我让线程正常工作,一切正常显示。但似乎我仍然无法专注于窗口。此外,等待时间太短,所以它变得快速。

2 个答案:

答案 0 :(得分:1)

什么类型的gw? 在任何情况下,Graphic对象都具有线程亲和力,这意味着您只能在初始化的线程中使用它们 将gw创建和初始化移动到工作线程,您的程序应该按预期工作(可能)。

但为什么要使用控制台呢?输入的文本字段会使此应用程序不需要多线程吗?

答案 1 :(得分:0)

Console.Read阻止调用线程,直到它收到输入。在控制台中按Enter键,它将移动。当我希望程序等到我连接调试器时,我经常把它放在main()的开头。

https://msdn.microsoft.com/en-us/library/system.console.read%28v=vs.110%29.aspx