一个有关线程的程序,当参数传递到线程函数里时就不能使用其中的链表指针来调用相应的方法。我调试了地址

void CCPUScheduleDlg::OnButtonStart() //启动线程的函数
{
// TODO: Add your control notification handler code here

resvpinfo.resvClist = &m_reserveList;//将列表地址包装成结构体
resvpinfo.redClist = &m_readyList;
resvpinfo.redlist = &redList;
resvpinfo.resvlist = &resvList;

m_reserveList.InsertItem(0,"6");
resvpinfo.resvClist->InsertItem(0,"g");

redpinfo.redClist = &m_readyList;
redpinfo.redlist = &redList;
redpinfo.cpuNameEdit = &m_CPnameEdit;
redpinfo.cpuPptyEdit = &m_CPpptyEdit;
redpinfo.cpuTimeEdit = &m_CPtimeEdit;
AfxBeginThread(ResSetRedThread,&resvpinfo);//启动线程
AfxBeginThread(RedSetCpuThread,&redpinfo);
}
//线程函数
UINT ResSetRedThread(LPVOID pParam){
while(running){
RESVPinfo* rp = (RESVPinfo*)pParam;//转化指针
CListCtrl* RVCList = rp->resvClist;///////////获取到的列表指针怎么不能用?
list<CPCB>* RVpList = rp->resvlist;
CListCtrl* RCList = rp->redClist;
list<CPCB>* RpList = rp->redlist;
i = rp->resvClist->GetItemCount();////这两步不能执行直接跳到 上 面的函数末尾
i = RVCList->GetItemCount();
wait(redMutex);//等待就绪队列不被使用,若能使用则修改信号量使其它进程不能使用
wait(resvMutex);//等待后备队列不被使用,若能使用则修改信号量使其它进程不能使用
while (ResvIsEmpty(resvn));//等待后备队列不为空
while (RedIsFull(redn));//等待就绪队列有位置
CPCB* p =new CPCB( &( RVpList->front() ) );//取后备队列的一个PCB
RVpList->pop_front();//弹出最顶端的进程
resvn--; //后备队列计数器减一
RefresList(RVCList,RVpList);//刷新后备队列

p->SetPstate(ready);//修改其状态
RpList->push_back(*p);//将p指向的对象入就绪队列
redn++; ///就绪队列计数器加一
RefresList(RCList,RpList);//刷新就绪队列的列表
signal(redMutex);//释放资源,使其它进程可以访问就绪队列
signal(resvMutex);//释放资源,使其它进程可以访问后备队列

Sleep(5000);//使线程睡5秒钟
}
return 0;
}

void RefresList(CListCtrl* Clist,list<CPCB>* pList)////刷新列表控件的函数
{
Clist->DeleteAllItems();
int col = 0;
list<CPCB>::iterator iter;
for (iter = pList->begin();iter != pList->end();iter++)
{
Clist->InsertItem(col,iter->GetPCSPid());
Clist->SetItemText(col,1,iter->GetPname());
Clist->SetItemText(col,2,iter->GetPCSPtime());
Clist->SetItemText(col,3,iter->GetPCSPpriority());
col++;
}
}

以上编译没有错误,但当开始start函数时(即第一个函数),则会弹出Debug Assertion Failed! 说是在strex.cpp文件的第681行有错。

第1个回答  2010-11-10
resvpinfo与redpinfo不能用局部变量,可以new一个出来,不知道你用的是不是局部变量。
第2个回答  2010-11-26
使用delegate是可以实现的,这里有一个例子:

这里传递的类是:LoanApplicant
delegate是ProcessLoanDelegate本回答被提问者和网友采纳
第3个回答  2010-11-16
太难了
相似回答