我这个题目的背景是这样的,有2个人A与B。A主要负责粗处理,面对的是大量数据,处理单个数据时间短。
B是处理A的结果进行精确处理,处理单个数据时间长。一个实际的例子就是A淘金,去掉样本中石头。B对A的结果进行精加工。考虑到尽量能够实时地给用户结果。采用了多线程的方式处理。这2种处理方式不考虑
1、A处理完之后全部给B,B全部处理完,然后反馈结果给用户。
2、A挑好一块粗金然后交给B(此时A停止),B加工好反馈结果之后,A再处理下一块。
这2种方式都可以用单线程处理我的想法是这样的。启用2类线程。A为主线程。当A找到一块粗金后,就传参启动一个B线程。但这样B线程会启动很多,如何解决互斥的问题?传递的参数是封装了一个类指针,以及需要处理的数据的结构体指针的地址。进过测试,如果同时存在2个B线程,就会发生错误。线程中没有解决好互斥。还有一种考虑方法。也是A与B线程。当A找到一块粗金后,开始建立链表,将链表头指针传递给B线程(并且启用标记)。B线程处理该链表数据。当A继续发现了粗金后,由于标记启用,则往链表添加数据。当B线程处理这个链表到最后时候。把A中标记置空。A再次遇到粗金后就释放原链表,开始新建新的链表。个人觉得这个方法应该没思路上的问题,但调试的时候找不到错误原因,
5F40E4A2 mov ecx,dword ptr [eax+20h],报错为这个。断在一个SetWindowsText上。这是A线程的static struct_row* head=NULL; //链表头指针
static struct_row* New=NULL; //链表新建指针
static struct_row* pointer=NULL; //链表最后一个指针if (bthread1) //还没建立一个子线程
{
bthread1=!bthread1; if (head!=NULL) //下次建立前要释放
{
struct_row * ptemp;
while (head!=NULL)
{
TRACE("正式释放\n");
ptemp=head;
head=head->next;
delete ptemp;
}
head=NULL;
New=NULL;
pointer=NULL;
TRACE("释放完毕\n"); MSG msg;
DWORD dwTimeStarted;
dwTimeStarted = ::GetTickCount();
UINT LFactor=2000; //延时时间
while (::GetTickCount() - dwTimeStarted < LFactor)
{
if (PeekMessage(&msg,0,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
} TRACE("新建线程\n");
New=new struct_row;
New->irow=iRow;
New->szPath=FilePath;
New->next=NULL;
head=New;
pointer=New; struct1 struct_Temp;
struct_Temp.pRow=New;
struct_Temp.pDlg=this; hThread1=CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)ThreadFunc1,
(LPVOID)&struct_Temp,
0,
&ThreadID1);
}
else
{
TRACE("加结点%d\n",iRow);
New=new struct_row;
New->irow=iRow;
New->szPath=FilePath;
New->next=NULL;
pointer->next=New;
pointer=New; }
iRow++; //别忘记iRow++
} struct1 *pst=(struct1*)(lpParam);
struct_row * pHead=pst->pRow; if (!(pst->pDlg->bthread1)) //表示已经建立了进程
{
while(pHead!=NULL)
{
int irow=pHead->irow;
CString szPath=pHead->szPath; TRACE("使用结点:%d\n",irow);
MSG msg;
DWORD dwTimeStarted;
dwTimeStarted = ::GetTickCount();
UINT LFactor=500; //延时时间
while (::GetTickCount() - dwTimeStarted < LFactor)
{
if (PeekMessage(&msg,0,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
//………………处理代码
pHead=pHead->next;
}
pst->pDlg->bthread1=true;
TRACE("开始释放\n");
}
B是处理A的结果进行精确处理,处理单个数据时间长。一个实际的例子就是A淘金,去掉样本中石头。B对A的结果进行精加工。考虑到尽量能够实时地给用户结果。采用了多线程的方式处理。这2种处理方式不考虑
1、A处理完之后全部给B,B全部处理完,然后反馈结果给用户。
2、A挑好一块粗金然后交给B(此时A停止),B加工好反馈结果之后,A再处理下一块。
这2种方式都可以用单线程处理我的想法是这样的。启用2类线程。A为主线程。当A找到一块粗金后,就传参启动一个B线程。但这样B线程会启动很多,如何解决互斥的问题?传递的参数是封装了一个类指针,以及需要处理的数据的结构体指针的地址。进过测试,如果同时存在2个B线程,就会发生错误。线程中没有解决好互斥。还有一种考虑方法。也是A与B线程。当A找到一块粗金后,开始建立链表,将链表头指针传递给B线程(并且启用标记)。B线程处理该链表数据。当A继续发现了粗金后,由于标记启用,则往链表添加数据。当B线程处理这个链表到最后时候。把A中标记置空。A再次遇到粗金后就释放原链表,开始新建新的链表。个人觉得这个方法应该没思路上的问题,但调试的时候找不到错误原因,
5F40E4A2 mov ecx,dword ptr [eax+20h],报错为这个。断在一个SetWindowsText上。这是A线程的static struct_row* head=NULL; //链表头指针
static struct_row* New=NULL; //链表新建指针
static struct_row* pointer=NULL; //链表最后一个指针if (bthread1) //还没建立一个子线程
{
bthread1=!bthread1; if (head!=NULL) //下次建立前要释放
{
struct_row * ptemp;
while (head!=NULL)
{
TRACE("正式释放\n");
ptemp=head;
head=head->next;
delete ptemp;
}
head=NULL;
New=NULL;
pointer=NULL;
TRACE("释放完毕\n"); MSG msg;
DWORD dwTimeStarted;
dwTimeStarted = ::GetTickCount();
UINT LFactor=2000; //延时时间
while (::GetTickCount() - dwTimeStarted < LFactor)
{
if (PeekMessage(&msg,0,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
} TRACE("新建线程\n");
New=new struct_row;
New->irow=iRow;
New->szPath=FilePath;
New->next=NULL;
head=New;
pointer=New; struct1 struct_Temp;
struct_Temp.pRow=New;
struct_Temp.pDlg=this; hThread1=CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)ThreadFunc1,
(LPVOID)&struct_Temp,
0,
&ThreadID1);
}
else
{
TRACE("加结点%d\n",iRow);
New=new struct_row;
New->irow=iRow;
New->szPath=FilePath;
New->next=NULL;
pointer->next=New;
pointer=New; }
iRow++; //别忘记iRow++
} struct1 *pst=(struct1*)(lpParam);
struct_row * pHead=pst->pRow; if (!(pst->pDlg->bthread1)) //表示已经建立了进程
{
while(pHead!=NULL)
{
int irow=pHead->irow;
CString szPath=pHead->szPath; TRACE("使用结点:%d\n",irow);
MSG msg;
DWORD dwTimeStarted;
dwTimeStarted = ::GetTickCount();
UINT LFactor=500; //延时时间
while (::GetTickCount() - dwTimeStarted < LFactor)
{
if (PeekMessage(&msg,0,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
//………………处理代码
pHead=pHead->next;
}
pst->pDlg->bthread1=true;
TRACE("开始释放\n");
}
解决方案 »
- MFC多文档问题?
- 我想用MSComm控件 导入正常 添加控件到窗体后 点击运行就停止工作 忘高手解答 在线等答案 急 谢谢
- 高分求24位图截取,请高人指点啊 ,最好给代码,小弟是新手,不晓得怎么弄啊 。。
- visual stdio.net 2005 之mfc
- 高手请进:如果解压器不支持调色板即ICDecompressGetPalette()返回值不是ICERR_OK,是否ICDecompress()就不可用了?
- ClistBox的重绘问题,MFC控件就这样?还是我错?
- 请问哪位仁兄能提供一个"俄罗斯方块"的文章?
- InstallShield的初级问题,必给分!
- 请问如何实现语音聊天室
- 帮助中说TimeSetEvent这个函数在调用他的同一个thread中运行,那么...
- 谁能帮我看看这简单的程序啊,就是显示不出来啊。。。
- 这个函数泄露在那里?
感觉还是A与B线程没隔离好
如果第一个思路如何实现?如何实现B类线程彼此之间互斥?
struct_Temp.pRow=New;
struct_Temp.pDlg=this; hThread1=CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)ThreadFunc1,
(LPVOID)&struct_Temp,
0,
&ThreadID1);
----------------------------------------
你传递给线程的参数是临时的结构体变量???
后来是在A中建立B线程后,就延迟2000ms,就没问题了。。