VC编程:
int CTryAgainView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CScrollView::OnCreate(lpCreateStruct) == -1)
return -1;
m_listView.Create(WS_VISIBLE|WS_CHILD|WS_BORDER|LVS_REPORT|LVS_NOSORTHEADER|LVS_EDITLABELS,
CRect(0,0,900,2000),this,IDC_LISTVIEW); ....
....//创建ClistCtrl
return 0;
}
void CTryAgainView::FillList(int n, int j, CString str)
{
.......//填写ClistCtrl}
//启动线程
void CTryAgainView::OnTest()
{
for(int i=0;i<10;i++)
{ cs.Lock();
str.Format("#%d---->Just test",i);
k=i;
j=i;
cs.Unlock();
thd=AfxBeginThread(WriteList,this,THREAD_PRIORITY_TIME_CRITICAL,NULL,NULL,NULL); }
}
//线程
UINT WriteList(LPVOID param)
{
int m,n;
CString str1;
CTryAgainView* pView=(CTryAgainView*) param;
pView->cs.Lock();
str1=((CTryAgainView*) param)->str;
m=((CTryAgainView*) param)->j;
n=((CTryAgainView*) param)->k;
pView->cs.Unlock();
((CTryAgainView*) param)->FillList(m,n,str1); return 0;
}
结果:我想达到每隔1秒显示一条数据的效果,但事实上他等时间耗尽,一起显示了出来结果.
提问:如何实现这个效果,最好能具体一点,谢谢了.
int CTryAgainView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CScrollView::OnCreate(lpCreateStruct) == -1)
return -1;
m_listView.Create(WS_VISIBLE|WS_CHILD|WS_BORDER|LVS_REPORT|LVS_NOSORTHEADER|LVS_EDITLABELS,
CRect(0,0,900,2000),this,IDC_LISTVIEW); ....
....//创建ClistCtrl
return 0;
}
void CTryAgainView::FillList(int n, int j, CString str)
{
.......//填写ClistCtrl}
//启动线程
void CTryAgainView::OnTest()
{
for(int i=0;i<10;i++)
{ cs.Lock();
str.Format("#%d---->Just test",i);
k=i;
j=i;
cs.Unlock();
thd=AfxBeginThread(WriteList,this,THREAD_PRIORITY_TIME_CRITICAL,NULL,NULL,NULL); }
}
//线程
UINT WriteList(LPVOID param)
{
int m,n;
CString str1;
CTryAgainView* pView=(CTryAgainView*) param;
pView->cs.Lock();
str1=((CTryAgainView*) param)->str;
m=((CTryAgainView*) param)->j;
n=((CTryAgainView*) param)->k;
pView->cs.Unlock();
((CTryAgainView*) param)->FillList(m,n,str1); return 0;
}
结果:我想达到每隔1秒显示一条数据的效果,但事实上他等时间耗尽,一起显示了出来结果.
提问:如何实现这个效果,最好能具体一点,谢谢了.
void CTryAgainView::OnTest()
{
Sleep(1000);
for(int i=0;i<10;i++)
{ cs.Lock();
str.Format("#%d---->Just test",i);
k=i;
j=i;
cs.Unlock();
thd=AfxBeginThread(WriteList,this,THREAD_PRIORITY_TIME_CRITICAL,NULL,NULL,NULL); }
}
//启动线程
void CTryAgainView::OnTest()
{
thd=AfxBeginThread(WriteList,this,THREAD_PRIORITY_TIME_CRITICAL,NULL,NULL,NULL);
}
//线程
UINT WriteList(LPVOID param)
{
int m,n;
CString str1;
CTryAgainView* pView=(CTryAgainView*) param; for(int i=0;i<10;i++)
{
str.Format("#%d---->Just test",i);
pView->FillList(i,i,str);
Sleep(1000);
}
return 0;
}
我拷贝进来的时候忘了复制Sleep了,已补充.
另外数据是我是做在在OnTest()里获得,
我是举例模拟一个读卡的数据获得,有一定的时间延迟,如果都写上来太长了.
CCriticalSection cs; // cs 是临界区
这个好象不用刷新就能正常.
{
//Sleep(1000);
for(int i=0;i<10;i++)
{
Sleep(1000);//我猜是在这里
cs.Lock();
str.Format("#%d---->Just test",i);
k=i;
j=i;
cs.Unlock();
thd=AfxBeginThread(WriteList,this,THREAD_PRIORITY_TIME_CRITICAL,NULL,NULL,NULL); }
}在这个for循环结束之前(大概10秒钟),OnTest()一直没有返回,主线程处于阻塞状态。
你可以用aa3000(杀手K)的方法试试,应该可以的
事实上我要做的事情是读取一张卡里64个块的数据,每读一个块,需要有一个相应的显示。
读卡大致就是一个循环验证、取数据的过程,会有一点延时,所以再循环里要加个sleep模拟一下,哈哈,结果我放错地方了。
我想读取的过程在Ontest()里完成。
如果按照aa3000的方法,我应该换个思路了,在线程里完成取数据还加上显示?这样就根本用不上线程了。
我写过不用线程的方法,结果是等我64个块的数据读完,等待了5-6秒吧,唰的全显示了,也是达不到这个效果。
就这例子而言,开10个线程可以考虑,但在writelist里放延时,那test里呢,还放延时吗?
如果不放,就和事实的要求的本意不合了。
还有一个问题,如果我把优先级设成Normal,第一次的数据str好像就丢失了,
在显示里,str为空数据,这也很奇怪,搞不明白,请指点一下其中的原因。
你说开10个线程会不会出现先写第10个数据再写第9个数据的情况啊
{
int m,n;
CString str1;
CTryAgainView* pView=(CTryAgainView*) param;
for(int i=0;i<10;i++){
pView->str="just test";
pView->k=i;
pView->j=i;
str1=((CTryAgainView*) param)->str;
m=((CTryAgainView*) param)->j;
n=((CTryAgainView*) param)->k;
Sleep(1000);
((CTryAgainView*) param)->FillList(m,n,str1);
}
return 0;
}
void CTryAgainView::OnTest()
{
thd=AfxBeginThread(WriteList,this,THREAD_PRIORITY_NORMAL,NULL,NULL,NULL);
}
aa3000的回答没有错阿,测试的结果正确
结果是正确的,并不代表符合题意啊
也许是我表达的有问题,我没分了,在非技术区开了一个新贴,去那里看看。
我要做的事情是读取一张卡里64个块的数据,每读一个块,需要有一个相应的显示。
我用Ontest()获取数据,用线程显示数据。
读卡大致就是一个循环验证、取数据的过程,会有一点延时,所以再循环里要加个sleep模拟一下
MFC编程:
int CTryAgainView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CScrollView::OnCreate(lpCreateStruct) == -1)
return -1;
m_listView.Create(WS_VISIBLE|WS_CHILD|WS_BORDER|LVS_REPORT|LVS_NOSORTHEADER|LVS_EDITLABELS,
CRect(0,0,900,2000),this,IDC_LISTVIEW); ....
....//创建ClistCtrl
return 0;
}
void CTryAgainView::FillList(int n, int j, CString str)
{
.......//填写ClistCtrl}
//启动线程
void CTryAgainView::OnTest()
{
for(int i=0;i<10;i++)
{
Sleep(1000);
cs.Lock();
str.Format("#%d---->Just test",i);
k=i;
j=i;
cs.Unlock();
thd=AfxBeginThread(WriteList,this,THREAD_PRIORITY_TIME_CRITICAL,NULL,NULL,NULL); }
}
//线程
UINT WriteList(LPVOID param)
{
int m,n;
CString str1;
CTryAgainView* pView=(CTryAgainView*) param;
pView->cs.Lock();
str1=((CTryAgainView*) param)->str;
m=((CTryAgainView*) param)->j;
n=((CTryAgainView*) param)->k;
pView->cs.Unlock();
((CTryAgainView*) param)->FillList(m,n,str1); return 0;
}
结果:我想达到每隔1秒显示一条数据的效果,但事实上他等时间耗尽,一起显示了出来结果.
提问:如何实现这个效果,最好能具体一点,谢谢了.
///或者不使用线程void CTryAgainView::OnTest()
{
// TODO: Add your command handler code here
for(int i=0;i<10;i++)
{
Sleep(1000);
str.Format("#%d---->Just test",i);
k=i;
j=i;
FillList(k,j,str); }
}
这样的结果和原来一样