C++ 使用线程执行任务并在后面执行某些操作的模式是什么

C++ 使用线程执行任务并在后面执行某些操作的模式是什么,c++,algorithm,oop,design-patterns,C++,Algorithm,Oop,Design Patterns,我在做什么: 有一个应用程序与播放器 用户按下“播放按钮”、“下载文件”或“播放并下载文件” 它触发一个线程来下载文件 我用MFC开发C++,线程不能轻松访问内部设备。我可以把HI/low这个词传过去 当线程结束并返回到主线程时,我如何发出信号表示线程应该执行什么操作? 实际上我在线程构造中传递了动作,如: 调用:StartThread(文件,播放) 线程的结尾:pClass->SendMessage(WM_downloaddevideothreadend,(WPARAM)downloadd

我在做什么:

  • 有一个应用程序与播放器
  • 用户按下“播放按钮”、“下载文件”或“播放并下载文件”
  • 它触发一个线程来下载文件

我用MFC开发C++,线程不能轻松访问内部设备。我可以把HI/low这个词传过去

当线程结束并返回到主线程时,我如何发出信号表示线程应该执行什么操作? 实际上我在线程构造中传递了动作,如:

调用:
StartThread(文件,播放)

线程的结尾:
pClass->SendMessage(WM_downloaddevideothreadend,(WPARAM)downloaddedfile,ACTION)

然后,当应用程序收到DOWNLOADVIDEOTHREADEND消息时,它检查操作并执行该操作

但它看起来并不优雅,它一团糟

这有什么模式吗


有更好的方法可以做到这一点吗?

通常应用程序中的主线程会花费大部分时间等待WaitForMultipleObjects()中的事件发生,然后在发生事件时通知事件发生

如果您将CreateThread()的结果视为WaitForMultipleObjects()中要等待的另一件事,则当线程终止时,它将显示为事件,因此您可以像对待任何其他事件一样对待此事件-请参见例如

或者,隐藏复杂等待的一般方法是创建一个线程,该线程的任务只是等待某类事件,并向程序的其余部分提供一个更为用户友好的界面


如果您厌倦了MFC,并且知道更好的接口设计,那么您可以选择用MFC编写包装器,并将该接口设计或类似设计呈现给程序的其余部分。

我认为您应该将应用程序的UI部分与不同模块中的逻辑部分分开。假设您编写了一个名为player的模块,那么您必须为player侦听器提供一个接口,比如Java的swing为按钮执行它。之后,您可以在任何地方捕获事件,而不依赖于您使用的技术(QT、MFC、VCL等)。因此,在这种情况下,您可以实现桥接、策略或观察者模式。我将为您提供一个桥梁设计模式的示例:

class Player{
private:
  IPlayerListener* _listener;

private:
  static void threadCallback( void* arg ){
     Player* player = (Player*)arg;
     //Download file here
     player._listener->downloadComplete( track );
  }

public:
  Player( IPlayerListener* listener ){
    _listener = listener;
  }

  bool playFile( uri file ){
    //Start a new thread and do all staff needed to download the file in there.
    thread.start(threadCallback, this);
  }
};
在界面中声明玩家可以抛出的所有类型的事件:

class IPlayerListener{
public:
 //...
 virtual void downloadComplete( const string& track )=0;
 //...
};
避免在项目中使用MFC之类的库,因为它可能会在项目中产生一些问题 未来。您可以移动到另一个平台,或者决定在GUI中使用另一个库,如QT


祝你好运。

MFC一点也不优雅。如果不是这样的话,你还有其他的选择:如果你C++,或者使用.c++,或者使用WPF或Windows窗体,使用Qt,谢谢Alexandre,但是MFC是一个要求,它是一个大的遗留项目。这是所有线程封送包装器的底层核心。它们的可用性有多高,这与能否跟上发布有很大关系。通常情况下,传统代码中的商店会出现问题。