2011-08-05 71 views
1

我试图找到答案,但我没有找到答案。检查是否有其他按钮被点击

我想要做这样的事情: 当我点击按钮,我想它重复动作直到另一个按钮被点击

我有这样的事情:

void __fastcall TForm1::BitBtn1Click(TObject *Sender) 
{ 
    if(pole!=NULL){ 
      pole->przesun_lidera(pole->wladca); 
      pole->rozstaw(); 
      pole->rysuj_plansze(); 
    } 
} 

,我想重复“如果”内的动作,直到我点击另一个按钮。

有人可以告诉我,我该怎么做到这一点?

回答

2

我想你在这里有两种可能性。一种是制作一个线程并在其中执行代码,直到由另一个按钮设置的条件为止。另一种可能性是通过调用ProcessMessages(),例如允许消息泵在循环内部处理消息。

void __fastcall TForm1::BitBtn1Click(TObject *Sender) 
{ 
    condition = false; 
    while(!condition && pole!=NULL){ 
      pole->przesun_lidera(pole->wladca); 
      pole->rozstaw(); 
      pole->rysuj_plansze(); 
      Application->ProcessMessages(); 
      Sleep(1); // don't be a processor hog 
    } 
} 

void __fastcall TForm1::BitBtn2Click(TObject *Sender) 
{ 
    condition = true; 
} 
+0

非常感谢您的回答 - 它解决了我的问题:) – rukya

+0

请注意,ProcessMessages()可以是可重入的 - 即用户可以导致任何正常事件发生,因此他们可以点击两次按钮,关闭程序等等。这个解决方案可以工作,但你应该意识到它可能导致的问题,而后台线程将会是一个更清洁的更复杂的解决方案。 –

+0

我同意David M.看看TEvent。 – Sam

0

您需要有一个在“背景”中执行的功能。

Windows是一个事件驱动系统。您的功能仅在Windows收到事件时激活。我的理解是,您希望在等待特定事件(按下按钮)时发生某些事情。事件之间的这段时间是“背景”时间。

一个想法是让Windows在等待时执行您的功能。在网上搜索“Windows旋转等待”。这将为您提供有关如何将函数“挂接”到背景或旋转等待循环的信息。

您可能还想创建另一个线程作为后台任务。让第一个按钮点击后台线程。后台线程将执行,直到信号量等待对象被设置。第二个按钮按下会设置这个信号量/等待对象,通知后台任务停止。有类似的方法,但这是问题的基础。

+0

你应该更具体。代码示例会对其他人有所帮助。我认为有很多人,包括我不了解所有Borland课程以及如何使用它。但你的想法很好。 – truthseeker