小白,小白,小白,求!求!求!大神关于VS2013多线程!求!求!求!大神关于VS2013多线程!求!求!求!大神关于VS2013多线程!

zgtjnhxglhj 2016-10-12 11:32:02
大神帮忙,我在百度也好,反正找变了,MFC多线程怎么也不成功

例程10 MultiThread10

建立一个基于对话框的工程MultiThread10,在对话框IDD_MULTITHREAD10_DIALOG中加入一个按钮和三个编辑框控件,按钮的ID为IDC_START,标题为“同时写‘A’、‘B’、‘C’”;三个编辑框的ID分别为IDC_A、IDC_B和IDC_C,属性都选中Read-only;
在MultiThread10Dlg.h文件中声明两个线程函数:
UINT WriteA(LPVOID pParam);
UINT WriteB(LPVOID pParam);
UINT WriteC(LPVOID pParam);

使用ClassWizard分别给IDC_A、IDC_B和IDC_C添加CEdit类变量m_ctrlA、m_ctrlB和m_ctrlC;
在MultiThread10Dlg.cpp文件中添加如下内容:
为了文件中能够正确使用同步类,在文件开头添加:

#include "afxmt.h"

定义信号量对象和一个字符数组,为了能够在不同线程间使用,定义为全局变量:
CSemaphore semaphoreWrite(2,2); //资源最多访问线程2个,当前可访问线程数2个 
char g_Array[10];

添加三个线程函数:

UINT WriteA(LPVOID pParam)
{
CEdit *pEdit=(CEdit*)pParam;
pEdit->SetWindowText("");
WaitForSingleObject(semaphoreWrite.m_hObject,INFINITE);
CString str;
for(int i=0;i<10;i++)
{
pEdit->GetWindowText(str);
g_Array[i]=''A'';
str=str+g_Array[i];
pEdit->SetWindowText(str);
Sleep(1000);
}
ReleaseSemaphore(semaphoreWrite.m_hObject,1,NULL);
return 0;

}
UINT WriteB(LPVOID pParam)
{
CEdit *pEdit=(CEdit*)pParam;
pEdit->SetWindowText("");
WaitForSingleObject(semaphoreWrite.m_hObject,INFINITE);
CString str;
for(int i=0;i<10;i++)
{

pEdit->GetWindowText(str);
g_Array[i]=''B'';
str=str+g_Array[i];
pEdit->SetWindowText(str);
Sleep(1000);
}
ReleaseSemaphore(semaphoreWrite.m_hObject,1,NULL);
return 0;

}
UINT WriteC(LPVOID pParam)
{
CEdit *pEdit=(CEdit*)pParam;
pEdit->SetWindowText("");
WaitForSingleObject(semaphoreWrite.m_hObject,INFINITE);
for(int i=0;i<10;i++)
{
g_Array[i]=''C'';
pEdit->SetWindowText(g_Array);
Sleep(1000);
}
ReleaseSemaphore(semaphoreWrite.m_hObject,1,NULL);
return 0;

}

这三个线程函数不再多说。在信号量对象有信号的状态下,线程执行到WaitForSingleObject语句处继续执行,同时可用线程数减1;若线程执行到WaitForSingleObject语句时信号量对象无信号,线程就在这里等待,直到信号量对象有信号线程才往下执行。
双击按钮IDC_START,添加其响应函数:
void CMultiThread10Dlg::OnStart() 
{
CWinThread *pWriteA=AfxBeginThread(WriteA,
&m_ctrlA,
THREAD_PRIORITY_NORMAL,
0,
CREATE_SUSPENDED);
pWriteA->ResumeThread();

CWinThread *pWriteB=AfxBeginThread(WriteB,
&m_ctrlB,
THREAD_PRIORITY_NORMAL,
0,
CREATE_SUSPENDED);
pWriteB->ResumeThread();

CWinThread *pWriteC=AfxBeginThread(WriteC,
&m_ctrlC,
THREAD_PRIORITY_NORMAL,
0,
CREATE_SUSPENDED);
pWriteC->ResumeThread();


}


大神帮忙给详细的改一下呗!

我的是这样的




...全文
1238 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
操作UI最好交给消息响应函数
赵4老师 2016-10-17
  • 打赏
  • 举报
回复
Multiple Threads in the User Interface http://msdn.microsoft.com/zh-cn/library/ms810439.aspx
赵4老师 2016-10-12
  • 打赏
  • 举报
回复
《Windows核心编程》
zgtjnhxglhj 2016-10-12
  • 打赏
  • 举报
回复
头一次发帖啊。
向立天 2016-10-12
  • 打赏
  • 举报
回复
类似的问题你是不是问过?
oyljerry 2016-10-12
  • 打赏
  • 举报
回复
你线程中PostMessage到主线程来更新UI控件
Eleven 2016-10-12
  • 打赏
  • 举报
回复
线程函数中不要直接操作UI上的控件~
1.uC/OS是个什么鬼?在一些朋友的留言和大神的文章中多次提到了uC/OS,相信很多朋友看到之后都是蒙B的“这是个什么鬼?”。uC/OS(MicroControlOperaTIonSystem)翻译过来就是微控制器操作系统,最初版本是在1992年发布,现在已经发展到uC/OSIII了。嗯,那它有什么用呢?接触过单片机或编程的朋友一定知道main()函数,mian()又叫主函数或者入口函数,顾名思义就是程序开始执行的地方(其实这是不严谨的,但是为了照顾小白可以这样简单的理解),而一般的裸机程序只有一个main(),从程序的开头到结尾跑一次就完了,而为了让程序能不停的跑往往会在main()中加一个while(true)让其不断的循环。uC/OS因为其处理方式理论上可以模拟无数个“main()函数”(任务),让这些任务并发运行,就像在一个单片机中有多个main()函数一样,让原本单线程的单片机能有多线程的效果。那uC/OS是变出无限个main函数呢,答案就是时钟节拍,时钟节拍就是系统以固定的频率产生中断(时基中断),并在中断中处理与时间相关的事件,推动所有任务向前运行。简单的来说就是高频率的切换任务来实现类似多线程的效果,这个时钟节拍是可调的,频率越快越浪费cpu,相应的在多个任务间切换的速度也就越快。那么什么是中断呢?从本质上来讲,中断是一种电信号的变化,当设备有某种事件发生时(产生电平变化),它就会产生中断,通过总线把电信号发送给中断控制器。如果中断的线是激活的,中断控制器就把电信号发送给处理器的某个特定引脚。处理器于是立即停止自己正在做的事,跳到中断处理程序的入口点,进行中断处理。(就好比小明现在正在看我写的这篇文章,突然有快递来敲门他就会先放下手机去取快递然后回来接着看,既拿了快递又读了文章)如上图所示电信号从低电平跳转高电平的中断称之为上升沿中断,反之称之为下降沿中断。因为篇幅的限制以上只是简单的介绍了一下uC/OS,当然它还有很多其它的优点,例如内存分配,任务消息队列,等等。这些都是这个系统多年迭代累积下来的“车轮”,如果感兴趣的朋友可以深入的了解一下。uC/OS固然是好,但是真的有必要什么都用uC/OS么?我看未必,杀鸡何用宰牛刀。以下引用一位知友的留言:“2以前没学过操作系统,用单片机裸机写程序。有一次做一个功能特别复杂的东西,发现中断都快用完了,并且用中断有些地方实现的特别勉强,冗余,复杂。当时根本就不知道有多任务,也以那时的知识根本想不到如何优化。如果当时学过操作系统,用过ucos,这个问题就很好解决了。不信,你看能不能用裸机实现一个简单的平板电脑。6以后想去大公司,做平板,做手机,不会嵌入式linux估计不行吧,这个依旧包括了上述所有知识。”(这位朋友表达的意思我懂,在此只是引用这一段话,只是引用!)(此段纯吐槽)可能是现在中国手机行业很赚钱。是个大一点的公司就要做平板,做手机,大公司都需要这样的人才,一窝蜂的往里钻。虽然arm理论上也算是单片机的一种,但是我更喜欢将其归入微处理器的行列,做手机做平板要是我肯定不会选stm32上uC/OS来做。如果是为了好找工作,为了做手机那还是学嵌入式linux比较靠谱。我是学自动化的,在我的感觉里单片机(stm32,avr,飞思卡尔,51等等)这类是属于微控器,最适合的就是用来做控制的,不是为了做手机而生的。和做人一样首先要清楚自己的定位,清楚自己能干什么,不能干什么。汽车芯片,3d打印机,数控机床,手环,液晶显示器,四轴,录像机,洗衣机,玩具,飞机仪表板等等等等,都有单片机的用武之地,我给它的定位就是简单重复高效的控制器。有朋友留言说“一句话想赚钱不要学这个。”我只能引用这样一句话“中国不是实体经济不行了,而是你的实体经济不行了。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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