我在定时器中有一个这样的一个函数,用来实现每秒遍历一边阻塞队列,然后把阻塞队列里的每一个阻塞时间-1显示在listview控件上面,我这个空间分为两栏,一个是进程名称,一个是阻塞时间。
{
if(!EmptyQueue(zuse))
{
zusenum=NumQueue(zuse);
for(j=0;j<zusenum;j++)
{
zusePCB=OutQueue(zuse);
if(zusePCB->zuseTime!=0)
{
SendMessage(hList,LVM_DELETEITEM,0,0);
sprintf(zusetmp,"%d",zusePCB->zuseTime);
LV_ITEM item;
item.mask=LVIF_TEXT;
item.iItem=0;
item.iSubItem=0;
item.pszText=zusePCB->name;
SendMessage(hList,LVM_INSERTITEM,(WPARAM)0,(WPARAM)&item);
item.iSubItem=1;
item.pszText=zusetmp;//其实每一秒需要修改的是这里,所以我想每次只是更改第二栏的内容而不是重新插入新的item项,因为我有多个阻塞进程,需要同时在listview中显示时间的倒计时
SendMessage(hList,LVM_SETITEM,(WPARAM)0,(WPARAM)&item);//这句是重新建立第一列和第二列不行
zusePCB->zuseTime-=1;
InQueue(zuse,zusePCB);
}
else
{
//唤醒进程
}
}
}
}
可能说的不清楚,我看大家不明白我在说说看吧。
{
if(!EmptyQueue(zuse))
{
zusenum=NumQueue(zuse);
for(j=0;j<zusenum;j++)
{
zusePCB=OutQueue(zuse);
if(zusePCB->zuseTime!=0)
{
SendMessage(hList,LVM_DELETEITEM,0,0);
sprintf(zusetmp,"%d",zusePCB->zuseTime);
LV_ITEM item;
item.mask=LVIF_TEXT;
item.iItem=0;
item.iSubItem=0;
item.pszText=zusePCB->name;
SendMessage(hList,LVM_INSERTITEM,(WPARAM)0,(WPARAM)&item);
item.iSubItem=1;
item.pszText=zusetmp;//其实每一秒需要修改的是这里,所以我想每次只是更改第二栏的内容而不是重新插入新的item项,因为我有多个阻塞进程,需要同时在listview中显示时间的倒计时
SendMessage(hList,LVM_SETITEM,(WPARAM)0,(WPARAM)&item);//这句是重新建立第一列和第二列不行
zusePCB->zuseTime-=1;
InQueue(zuse,zusePCB);
}
else
{
//唤醒进程
}
}
}
}
可能说的不清楚,我看大家不明白我在说说看吧。
可以用setitemText达到你的要求
为什么用SendMessage呢?
SendMessage(hList,LVM_INSERTITEM,(WPARAM)0,(WPARAM)&item);
不是又
ListView_Insert这些宏API吗?再说了,你现在用的可是MFC啊~
这是设置list item项的数据.每次自能设置一项.你每行有两项数据,因此需要调用两次.另外注意维护item.iItem,item.iSubItem的值.尤其要是你每次item.iItem都等于0的时候,只会设置第一行的item表项数据,其他表项的都没有设置数据
因为我想用winsdk实现,所以就用了sdk和mfc混编了,因为我原先看过一片这个文章,在sdk下使用mfc的listview控件
SetItemText(nRow, nCol, text);
一样的
SetItemText有对应的消息
查一下MSDN