一个让我郁闷了一个下午的问题。请高手帮忙解决。(分不够可以再加)

时间:2022-04-23 10:31:52
我在一个副线程中随机生成数组,每隔1s生成一组,循环生成若干组(在主线程中如果不终止这个线程,副线程中的循环一直执行下去),每生成一组数据,就在主线程中寻找出它的最大吓最小值之间的差值,并在坐标中画出一条直线。循环生成数组,则反复画出直线,直到生成一条差值曲线。
说明:副线程只负责生成随机数组。
请问该如何实现?

20 个解决方案

#1


数组用全局变量或者用带进来的指针.
线程序每生成好一组,用SendMessage告诉主线程,主线程序处理好直线后再返回.这很好做啊.

#2


多谢,可是我不知道该SendMessage什么给主线程。可以指导一下吗?

#3


不明白你想问什么问题

如果你用全局资源的话,要注意同步

#4


#define WM_ARRAY_READY    WM_USER+100

SendMessage(hwnd,WM_ARRAY_READY,0,0)

#5


我用的不是全局资源。

#6


/////////.h/////
typedef struct tagDATA
{
//:+you data like int i;
HWND hwnd;
}ThreadData;

class xxx
{
...
private:
ThreadData m_ThreadData;
}
////////cpp///////
#define MSG_STOPPED WM_USER+101
int Stop=0;//信号量
UINT ThreadRandomName(PVOID lpParam)
{
ThreadData* pData=(ThreadData*)lpParam;
//:+you code
srand(time(NULL));

while(true)
{
//:+you code like  count = UINT(rand());

if(Stop) {PostMessage(pData->hwnd,MSG_STOPPED,0,0); return 0;

}
return 0;
}

//主线程里 设置 stop = x 信号 控制副线程

#7


把数组的地址Send过去。例如
int buff[100];

SendMessage(hwnd,WM_ARRAY_READY,0,(LPARAM)buff);

然后那边再转换回去

int *buff=(int *)lParam;

#8


//主线程里:
void CRadanNameDlg::OnOK() 
{
Stop = 0;

m_ThreadData.hwnd=GetSafeHwnd();
m_ThreadData.pDname=pHEAD;
AfxBeginThread(ThreadRandomName,&m_ThreadData);
}

//这是一个主线程由副先程产生随机姓名的代码自己看看吧

#9


消息已经发送出来了,怎么样编写自定义的消息响应函数呢?我是第一次接触多线程,还请各位多多帮忙。我消息传出后,发现副线程仍旧在生成随机数组,怎么样让它暂停下来啊?我用SuspendThread不行。还有,主线程处理完后是不是用ResumeThread来恢复?

#10


gz

#11


我用PostMessage(pData->hwnd,WM_ARRAY_READY,0)发送消息,编译出错:D:\APPLICATIONS\Sampling\SamplingView.cpp(264) : error C2664: 'PostMessageA' : cannot convert parameter 1 from 'struct HWND__ *' to 'unsigned int'
怎么回事啊?

#12


是发送线程消息,不是发送消息

#13


发送线程消息?我不太明白,能给我解释一下吗?

#14


看来你需要先熟悉VC才对。

#15


是的,可是现在项目很急,您先给我解释一下好吗?

#16


PostThreadMessage 函数嘛,“深入浅出”中不是有介绍消息循环么,GetMessage 和PeekMessage 的区别是窗体是否将消息从消息队列中被删除,然后每个线程会维护一个消息队列(包括COM的套间模型其实也是在指消息队列)

如果你只是简单地发送消息的话,只是在本线程的消息队列内增加一个item,等着窗体去GetMessage,而一个窗体也只会到创建它的那个线程的消息队列中去取数据

其实我觉得线程通讯还是用关键扇区之类的好一些吧

#17


在MFC中,多线程和多模块(指VC工程)是同一个的方向的,你应该多看一些关于关于进程数据/线程数据/模块数据之类的资料

在编写多模块程序时,需要维护一个模块状态,MFC中句柄的使用应该是在一个模块状态内

我的说这话的意思是:建议别在不同的线程中使用同一个句柄

#18


你提的问题是典型的生产者和消费者问题,可以在任何课本上找到

可以用一个staic float s_fBuffer[];和一个关键扇区解决:
辅线程循环地锁定、改变s_fBuffer中的值,在解锁
主线程则包含一个定时器,每触发一次,用s_fBuffer中的数据更新自己的成员变量(读时也要锁定和解锁)


如果你不要求数据的完整性(既然你是随机的),你甚至可以连关键扇区都省略,就是不用加锁/解锁,而直接读

#19


请问要对这方面有较好的了解,需要看什么书?请推荐 几本好吗?

#20


我也没看什么书,我觉得对我帮助最大的书还是“深入浅出”吧,在看书那段时间我特别爱看VC附带的源程序

那关于线程理论的书就不说了;对于MFC中的线程等数据,我推荐这两个文件吧AFXSTATE.CPP/WINHAND.CPP,它们是与模块状态有关的,而且都只有两、三百行,挺精彩的

在看AFXSTATE.CPP文件之前,最好找本老一点的书,自己用C语言编个窗体循环

#1


数组用全局变量或者用带进来的指针.
线程序每生成好一组,用SendMessage告诉主线程,主线程序处理好直线后再返回.这很好做啊.

#2


多谢,可是我不知道该SendMessage什么给主线程。可以指导一下吗?

#3


不明白你想问什么问题

如果你用全局资源的话,要注意同步

#4


#define WM_ARRAY_READY    WM_USER+100

SendMessage(hwnd,WM_ARRAY_READY,0,0)

#5


我用的不是全局资源。

#6


/////////.h/////
typedef struct tagDATA
{
//:+you data like int i;
HWND hwnd;
}ThreadData;

class xxx
{
...
private:
ThreadData m_ThreadData;
}
////////cpp///////
#define MSG_STOPPED WM_USER+101
int Stop=0;//信号量
UINT ThreadRandomName(PVOID lpParam)
{
ThreadData* pData=(ThreadData*)lpParam;
//:+you code
srand(time(NULL));

while(true)
{
//:+you code like  count = UINT(rand());

if(Stop) {PostMessage(pData->hwnd,MSG_STOPPED,0,0); return 0;

}
return 0;
}

//主线程里 设置 stop = x 信号 控制副线程

#7


把数组的地址Send过去。例如
int buff[100];

SendMessage(hwnd,WM_ARRAY_READY,0,(LPARAM)buff);

然后那边再转换回去

int *buff=(int *)lParam;

#8


//主线程里:
void CRadanNameDlg::OnOK() 
{
Stop = 0;

m_ThreadData.hwnd=GetSafeHwnd();
m_ThreadData.pDname=pHEAD;
AfxBeginThread(ThreadRandomName,&m_ThreadData);
}

//这是一个主线程由副先程产生随机姓名的代码自己看看吧

#9


消息已经发送出来了,怎么样编写自定义的消息响应函数呢?我是第一次接触多线程,还请各位多多帮忙。我消息传出后,发现副线程仍旧在生成随机数组,怎么样让它暂停下来啊?我用SuspendThread不行。还有,主线程处理完后是不是用ResumeThread来恢复?

#10


gz

#11


我用PostMessage(pData->hwnd,WM_ARRAY_READY,0)发送消息,编译出错:D:\APPLICATIONS\Sampling\SamplingView.cpp(264) : error C2664: 'PostMessageA' : cannot convert parameter 1 from 'struct HWND__ *' to 'unsigned int'
怎么回事啊?

#12


是发送线程消息,不是发送消息

#13


发送线程消息?我不太明白,能给我解释一下吗?

#14


看来你需要先熟悉VC才对。

#15


是的,可是现在项目很急,您先给我解释一下好吗?

#16


PostThreadMessage 函数嘛,“深入浅出”中不是有介绍消息循环么,GetMessage 和PeekMessage 的区别是窗体是否将消息从消息队列中被删除,然后每个线程会维护一个消息队列(包括COM的套间模型其实也是在指消息队列)

如果你只是简单地发送消息的话,只是在本线程的消息队列内增加一个item,等着窗体去GetMessage,而一个窗体也只会到创建它的那个线程的消息队列中去取数据

其实我觉得线程通讯还是用关键扇区之类的好一些吧

#17


在MFC中,多线程和多模块(指VC工程)是同一个的方向的,你应该多看一些关于关于进程数据/线程数据/模块数据之类的资料

在编写多模块程序时,需要维护一个模块状态,MFC中句柄的使用应该是在一个模块状态内

我的说这话的意思是:建议别在不同的线程中使用同一个句柄

#18


你提的问题是典型的生产者和消费者问题,可以在任何课本上找到

可以用一个staic float s_fBuffer[];和一个关键扇区解决:
辅线程循环地锁定、改变s_fBuffer中的值,在解锁
主线程则包含一个定时器,每触发一次,用s_fBuffer中的数据更新自己的成员变量(读时也要锁定和解锁)


如果你不要求数据的完整性(既然你是随机的),你甚至可以连关键扇区都省略,就是不用加锁/解锁,而直接读

#19


请问要对这方面有较好的了解,需要看什么书?请推荐 几本好吗?

#20


我也没看什么书,我觉得对我帮助最大的书还是“深入浅出”吧,在看书那段时间我特别爱看VC附带的源程序

那关于线程理论的书就不说了;对于MFC中的线程等数据,我推荐这两个文件吧AFXSTATE.CPP/WINHAND.CPP,它们是与模块状态有关的,而且都只有两、三百行,挺精彩的

在看AFXSTATE.CPP文件之前,最好找本老一点的书,自己用C语言编个窗体循环

#21