MFC多线程的应用有关问题请问
MFC多线程的应用问题请教
用vs新建一个基于对话框的MFC应用程序,添加两个按钮IDC_BUTTON1和IDC_BUTTON2,一个静态框IDC_STATIC
对应变量名分别为m_BUTTON1、m_BUTTON2、m_STATIC。
现有如下代码段:
//代码段1
int i=0;
while(1)
{
i++;
char temp[25];
sprintf(temp,"%d",i);
m_STATIC.SetWindowTextA(temp);
}
//代码段1结束
要求:
1.按下BUTTON1时,执行上述代码段1;
2.按下BUTTON2时,停止正在执行的代码段1。
请各位帮忙看一下这个该怎么实现!
代码段1中的while可以改为for循环!
我事先进行了一些搜索,好像大家都说要用线程处理,我之前完全没接触过线程,所以一直一头雾水!
哪位大神能帮忙给写个简单的例子?
我这里先谢过了!
------解决方案--------------------
"请各位帮忙看一下这个该怎么实现"
听听你的想法
------解决方案--------------------
int i=0;
while(1)
{
i++;
char temp[25];
sprintf(temp,"%d",i);
m_STATIC.SetWindowTextA(temp);
}
问题在while(1)
他会阻塞主程序,使主程序相应不了消息
1. 改成定时器,每次时间到坐一次 代码1
2. 在 while 内 插入检查 消息的代码
PeekMessage()
------解决方案--------------------
开一个线程,一个按钮启动线程,另一个线程挂起(暂停)线程
------解决方案--------------------
while(1) 需要增加 Sleep 函数的调用
然后再设置退出标志,Button2 按下时设置此标志,就可以退出了
------解决方案--------------------
你搜一下Createthread();这个是创建线程并启动,suspendthread();挂起线程,resumethread();恢复线程,要终止线程可以用createEvent();,你可以分别搜一下这几个函数,主要是createthread();你可以去msdn上看看上边的example。动手去做不是很难的。
------解决方案--------------------
在while循环里最好加一个sleep否则一直占用cpu可能会阻塞其他线程
------解决方案--------------------
用定时器最简单, 不必开 线程
------解决方案--------------------
本人非计算机专业,多线程一晚上看懂,两天应用在实际项目上
很多东西其实一点也不难,怕就怕你根本不看
------解决方案--------------------
1 创建线程时允许你向线程函数传递一个参数,如果线程里需要用什么,就把它的指针传过去,如果要传的东西很多,就打包成一个结构体,把结构体指针传过去
2 不能在多线程里修改界面,多线程计算数据并传给主线程,主线程可以在OnTimer里显示数据,传数据时注意加锁
3 多线程要求线程函数必须是全局函数或静态函数,这是线程的本质决定的,如果是类的成员函数那必须是静态成员函数。如果你要让线程处理一个对象,就把这个对象的指针传给线程
简单的说,是线程创建对象,而不是线程属于对象
------解决方案--------------------
仅供参考
用vs新建一个基于对话框的MFC应用程序,添加两个按钮IDC_BUTTON1和IDC_BUTTON2,一个静态框IDC_STATIC
对应变量名分别为m_BUTTON1、m_BUTTON2、m_STATIC。
现有如下代码段:
//代码段1
int i=0;
while(1)
{
i++;
char temp[25];
sprintf(temp,"%d",i);
m_STATIC.SetWindowTextA(temp);
}
//代码段1结束
要求:
1.按下BUTTON1时,执行上述代码段1;
2.按下BUTTON2时,停止正在执行的代码段1。
请各位帮忙看一下这个该怎么实现!
代码段1中的while可以改为for循环!
我事先进行了一些搜索,好像大家都说要用线程处理,我之前完全没接触过线程,所以一直一头雾水!
哪位大神能帮忙给写个简单的例子?
我这里先谢过了!
------解决方案--------------------
"请各位帮忙看一下这个该怎么实现"
听听你的想法
------解决方案--------------------
int i=0;
while(1)
{
i++;
char temp[25];
sprintf(temp,"%d",i);
m_STATIC.SetWindowTextA(temp);
}
问题在while(1)
他会阻塞主程序,使主程序相应不了消息
1. 改成定时器,每次时间到坐一次 代码1
2. 在 while 内 插入检查 消息的代码
PeekMessage()
------解决方案--------------------
开一个线程,一个按钮启动线程,另一个线程挂起(暂停)线程
------解决方案--------------------
while(1) 需要增加 Sleep 函数的调用
然后再设置退出标志,Button2 按下时设置此标志,就可以退出了
------解决方案--------------------
你搜一下Createthread();这个是创建线程并启动,suspendthread();挂起线程,resumethread();恢复线程,要终止线程可以用createEvent();,你可以分别搜一下这几个函数,主要是createthread();你可以去msdn上看看上边的example。动手去做不是很难的。
------解决方案--------------------
在while循环里最好加一个sleep否则一直占用cpu可能会阻塞其他线程
------解决方案--------------------
用定时器最简单, 不必开 线程
------解决方案--------------------
本人非计算机专业,多线程一晚上看懂,两天应用在实际项目上
很多东西其实一点也不难,怕就怕你根本不看
------解决方案--------------------
1 创建线程时允许你向线程函数传递一个参数,如果线程里需要用什么,就把它的指针传过去,如果要传的东西很多,就打包成一个结构体,把结构体指针传过去
2 不能在多线程里修改界面,多线程计算数据并传给主线程,主线程可以在OnTimer里显示数据,传数据时注意加锁
3 多线程要求线程函数必须是全局函数或静态函数,这是线程的本质决定的,如果是类的成员函数那必须是静态成员函数。如果你要让线程处理一个对象,就把这个对象的指针传给线程
简单的说,是线程创建对象,而不是线程属于对象
------解决方案--------------------
仅供参考
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef WIN32
#include <windows.h>
#include <io.h>
#include <process.h>
#define MYVOID void
#else
#include <unistd.h>
#include <sys/time.h>
#include <pthread.h>
#define CRITICAL_SECTION pthread_mutex_t
#define _vsnprintf vsnprintf
#define MYVOID void *
#endif
//Log{
#define MAXLOGSIZE 20000000
#define ARRSIZE(x) (sizeof(x)/sizeof(x[0]))
#include <time.h>
#include <sys/timeb.h>
#include <stdarg.h>
char logfilename1[]="MyLog1.log";
char logfilename2[]="MyLog2.log";
char logstr[16000];
char datestr[16];
char timestr[16];
char mss[4];
CRITICAL_SECTION cs_log;
FILE *flog;
#ifdef WIN32
void Lock(CRITICAL_SECTION *l) {
EnterCriticalSection(l);
}
void Unlock(CRITICAL_SECTION *l) {
LeaveCriticalSection(l);
}
void sleep_ms(int ms) {
Sleep(ms);
}
#else
void Lock(CRITICAL_SECTION *l) {
pthread_mutex_lock(l);
}
void Unlock(CRITICAL_SECTION *l) {
pthread_mutex_unlock(l);
}
void sleep_ms(int ms) {
usleep(ms*1000);
}
#endif
void LogV(const char *pszFmt,va_list argp) {
struct tm *now;
struct timeb tb;
if (NULL==pszFmt
------解决方案--------------------
0==pszFmt[0]) return;
if (-1==_vsnprintf(logstr,ARRSIZE(logstr),pszFmt,argp)) logstr[ARRSIZE(logstr)-1]=0;
ftime(&tb);
now=localtime(&tb.time);
sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);
sprintf(timestr,"%02d:%02d:%02d",now->tm_hour ,now->tm_min ,now->tm_sec );
sprintf(mss,"%03d",tb.millitm);