线程同步的问题

时间:2021-04-09 13:02:43
我在对话框类里调用一个函数,他会响应另一个类里的方法,我想在他响应完后在对话框里进行后续处理,于是我创建了一个互斥对象,但是没有成功,请教一下该如何实现?

对话框类里的按钮单击事件:
void CquoteapitestmfcDlg::OnBtnConnect()
{

//创建互斥对象
hMutex=CreateMutex(NULL,FALSE,NULL);

// 使客户端开始与后台服务建立连接
pUserApi->Init();

WaitForSingleObject(hMutex, INFINITE);
ReleaseMutex(hMutex);
//后续代码
。。。。。。。。。。。。。。
}

另一个类里的代码:
 void CSimpleHandle::OnFrontConnected()
{
WaitForSingleObject(m_pQuoteDlg->hMutex, INFINITE);

CThostFtdcReqUserLoginField reqUserLogin;

// get BrokerID
strcpy(reqUserLogin.BrokerID, m_pQuoteDlg->m_brokerID);
// get userid
strcpy(reqUserLogin.UserID, m_pQuoteDlg->m_userID);
// get password
strcpy(reqUserLogin.Password, m_pQuoteDlg->m_password);
// 发出登陆请求
m_pUserApi->ReqUserLogin(&reqUserLogin, 0);
                  ReleaseMutex(m_pQuoteDlg->hMutex);

}
当按钮单击事件中执行完pUserApi->Init();语句后,我希望他应该能执行另一个类里的这个代码,但是程序没有停住,而是一直执行到单击事件的其他代码后,才跳转到另一个类里执行,请问解决的方法?

 

10 个解决方案

#1


创建CreateEvent

#2


OnFrontConnected 这个函数是线程函数吗? 一直在执行吗?

我想你应该在 OnBtnConnect 这个函数里面启动一个线程,线程里面 CreateMutex 结束了 再
ReleaseMutex

总之你贴的代码没看到线程,谈何线程同步。

#3


lz使用了多线程吗? 
怎么没有看到。

线程同步和类的成员函数执行顺序没有什么关系哦

#4


刚开始我也是创建的CreateEvent,但是程序跳转以后就卡死了
HANDLE g_hEvent = CreateEvent(NULL, true, false, NULL);
// 使客户端开始与后台服务建立连接
pUserApi->Init();

WaitForSingleObject(g_hEvent, INFINITE);
//ReleaseMutex(hMutex);
int a=0;
int b=0;

#5


API说明里是这样描述的:客户端应用程序至少由两个线程组成,一个是应用程序主线程,一个
是API 工作线程。应用程序与交易系统的通讯是由API 工作线程驱动的。他的相应函数都是在他的类里完成的,我不太清楚该如何创建API工作线程来和应用程序通讯

#6


请问我如何去创建一个API工作线程,然后当我单击对话框按钮时,执行到pUserApi->Init();语句时进入到API工作线程,处理完以后再返回到应用程序主线程中工作?之前我也创建了一个线程,发现他和我的API函数相应没有关系,所以才删掉了那个线程。

#7


首先,根据你现在描述的问题,没必要用线程同步。直接在 OnBtnConnect 函数里执行 A类的XX函数,再执行pUserApi->Init();就完了。


如果确定要用线程同步。添加类成员CEvent m_vent;
在 OnBtnConnect 函数里,启动A,B 线程。
A 执行A类的XX函数,执行完了 m_vent.SetEvent
B 一开始就等待 m_vent.Wait 后面接着pUserApi->Init();

#8


A类的函数是执行pUserApi->Init()以后自动触发的,我现在是添加了一个CEvent 对象,我发现没有m_vent.Wait方法,我就用lock方法替代了,发现可以完成转换,
我有两个问题,像这样的API函数,是不是他内部就有一个线程,我不需要创建线程,因为我发现当我执行pUserApi->Init()以后,如果我用Sleep(5000),发现它会自动转去执行A类中的API函数。

另外,我发现使用m_vent方法后,在A类中要是用m_vent.SetEvent去设置为真,以便结束等待,但是如果我在这条语句前加上MessageBox(),程序仍然会卡死,不知是什么原因,该如何解决?

谢谢

#9


bool CSyncEvent::Wait(int nTime)
{
return WAIT_OBJECT_0 == ::WaitForSingleObject(m_handle,nTime);

}

我习惯用自己封装的了。
对话框类本身就是主线程。如果你在这个函数 OnBtnConnect 里面的线程MessageBox
而 OnBtnConnect  这个函数还没结束。对话框主线程就处理不了消息,死循环了

通俗说:对话框等待线程结束,线程又要对话框响应我的消息。死掉了

#10


非常感谢xiaoc1026的说明,我明白了为什么会出现对话框响应消息的时候死掉了,也明白了其实另一个类里面的函数是在做其他线程的事情,但是我还想请教一下,其实另一个类里面有很多这样的响应函数,我难道要为这么多函数都定义一个事件去控制和对话框主线程的交互吗,因为另一个类里面的方法是负责通信的,他可能会自动进行触发,这时我的主线程就接收不到信息了,但是我又不能设立循环让他们一直这样等待执行,有没有像事件处理循环一样的机制可以让我一边随时接收另一个类里面传来的变化,另一方面主线程还可以运行?

#1


创建CreateEvent

#2


OnFrontConnected 这个函数是线程函数吗? 一直在执行吗?

我想你应该在 OnBtnConnect 这个函数里面启动一个线程,线程里面 CreateMutex 结束了 再
ReleaseMutex

总之你贴的代码没看到线程,谈何线程同步。

#3


lz使用了多线程吗? 
怎么没有看到。

线程同步和类的成员函数执行顺序没有什么关系哦

#4


刚开始我也是创建的CreateEvent,但是程序跳转以后就卡死了
HANDLE g_hEvent = CreateEvent(NULL, true, false, NULL);
// 使客户端开始与后台服务建立连接
pUserApi->Init();

WaitForSingleObject(g_hEvent, INFINITE);
//ReleaseMutex(hMutex);
int a=0;
int b=0;

#5


API说明里是这样描述的:客户端应用程序至少由两个线程组成,一个是应用程序主线程,一个
是API 工作线程。应用程序与交易系统的通讯是由API 工作线程驱动的。他的相应函数都是在他的类里完成的,我不太清楚该如何创建API工作线程来和应用程序通讯

#6


请问我如何去创建一个API工作线程,然后当我单击对话框按钮时,执行到pUserApi->Init();语句时进入到API工作线程,处理完以后再返回到应用程序主线程中工作?之前我也创建了一个线程,发现他和我的API函数相应没有关系,所以才删掉了那个线程。

#7


首先,根据你现在描述的问题,没必要用线程同步。直接在 OnBtnConnect 函数里执行 A类的XX函数,再执行pUserApi->Init();就完了。


如果确定要用线程同步。添加类成员CEvent m_vent;
在 OnBtnConnect 函数里,启动A,B 线程。
A 执行A类的XX函数,执行完了 m_vent.SetEvent
B 一开始就等待 m_vent.Wait 后面接着pUserApi->Init();

#8


A类的函数是执行pUserApi->Init()以后自动触发的,我现在是添加了一个CEvent 对象,我发现没有m_vent.Wait方法,我就用lock方法替代了,发现可以完成转换,
我有两个问题,像这样的API函数,是不是他内部就有一个线程,我不需要创建线程,因为我发现当我执行pUserApi->Init()以后,如果我用Sleep(5000),发现它会自动转去执行A类中的API函数。

另外,我发现使用m_vent方法后,在A类中要是用m_vent.SetEvent去设置为真,以便结束等待,但是如果我在这条语句前加上MessageBox(),程序仍然会卡死,不知是什么原因,该如何解决?

谢谢

#9


bool CSyncEvent::Wait(int nTime)
{
return WAIT_OBJECT_0 == ::WaitForSingleObject(m_handle,nTime);

}

我习惯用自己封装的了。
对话框类本身就是主线程。如果你在这个函数 OnBtnConnect 里面的线程MessageBox
而 OnBtnConnect  这个函数还没结束。对话框主线程就处理不了消息,死循环了

通俗说:对话框等待线程结束,线程又要对话框响应我的消息。死掉了

#10


非常感谢xiaoc1026的说明,我明白了为什么会出现对话框响应消息的时候死掉了,也明白了其实另一个类里面的函数是在做其他线程的事情,但是我还想请教一下,其实另一个类里面有很多这样的响应函数,我难道要为这么多函数都定义一个事件去控制和对话框主线程的交互吗,因为另一个类里面的方法是负责通信的,他可能会自动进行触发,这时我的主线程就接收不到信息了,但是我又不能设立循环让他们一直这样等待执行,有没有像事件处理循环一样的机制可以让我一边随时接收另一个类里面传来的变化,另一方面主线程还可以运行?