怎么让主线程等到副线程结束后再继续运行......

wu__123 2010-03-15 02:35:32
我用BCB写了一个TFTP的应用程序,然后把它做成了动态库,应用程序都能正常工作,可我单独测试里面的收发消息的API时就不能正常工作

g_cEvent = CreateEvent(NULL,false,false,NULL);
TClient client = TClient::GetInstance();
client.ThreadStart(info,TFTP_WRQ);
Log(LOG_PATH,START_FILE,START_FUNC,START_LINE,"rcvPrck--------------------------");
while(1) {
if (WAIT_OBJECT_0 == MsgWaitForMultipleObjects(1,&g_cEvent,False,INFINITE,QS_POSTMESSAGE) ) {
Log(LOG_PATH,START_FILE,START_FUNC,START_LINE,"break--------------------------");
CloseHandle(g_cEvent);
break;
} else {
MSG msg;
i = PeekMessage(&msg,NULL,0,0,PM_REMOVE);
Log(LOG_PATH,START_FILE,START_FUNC,START_LINE,"dispachmsg-------------------");
DispatchMessage(&msg);
}
}
Log(LOG_PATH,START_FILE,START_FUNC,START_LINE,"exit----------------------------");


调用client.ThreadStart(info,TFTP_WRQ)后开启了一个收发消息的线程,我用MsgWaitForMultipleObjects等待线程返回,我单独测试API的时候发现老是停在 dispachmsg-----------------,收发消息的线程好像就没有被执行,可我运行写好的应用程序又能够正常工作,这是什么问题啊?
...全文
188 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
wu__123 2010-03-16
  • 打赏
  • 举报
回复
我调试看了那个收发线程好像是因为没有PeekMessage到某种消息才没有被执行..一直就在循环dispachmsg..
wu__123 2010-03-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 1cctv 的回复:]
把QS_POSTMESSAGE换成QS_ALLINPUT试试.
[/Quote]

试过了不行.
1cctv 2010-03-16
  • 打赏
  • 举报
回复
我一般这么玩儿.



//unit.h
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
void __fastcall FormCreate(TObject *Sender);
private: // User declarations

void __fastcall WndProc(Messages::TMessage &Message);

public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
class work : public TThread
{
private:
protected:
void __fastcall Execute();
public:
__fastcall work(bool CreateSuspended);
HWND mainWin;
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif








//unit.cpp

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
work *wth;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
__fastcall work::work(bool CreateSuspended)
: TThread(CreateSuspended)
{
FreeOnTerminate=true;
}
//---------------------------------------------------------------------------
void __fastcall work::Execute()
{
while(true)
{
Sleep(2000);
Beep(1000,100);
PostMessage(mainWin,WM_USER+10,0,0);
break;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
wth=new work(true);
wth->mainWin=Handle;
wth->Resume();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::WndProc(Messages::TMessage &Message)
{
if(Message.Msg==WM_USER+10)
{
ShowMessage("th exit");
return;
}

TForm::WndProc(Message);
}
//---------------------------------------------------------------------------



YeBinYe 2010-03-15
  • 打赏
  • 举报
回复

TMyThread *Thread=new TMyThread(false);
Thread->WaitFor();
Sleep(500);
Thread->Terminate();
delete Thread;
1cctv 2010-03-15
  • 打赏
  • 举报
回复
把QS_POSTMESSAGE换成QS_ALLINPUT试试.
wu__123 2010-03-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ydlchina 的回复:]
这似乎是生产与消费的问题.看一下,网上有这个例子
[/Quote]

可是我的应用程序都能正常运行,单独拿DLL来测试这个API的时候就不能正常工作,一直死在处理消息循环.
ydlchina 2010-03-15
  • 打赏
  • 举报
回复
这似乎是生产与消费的问题.看一下,网上有这个例子

13,873

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧