100分 在线等 现场结帖

strwolf 2009-12-26 06:21:54
1、我用一个线程来执行成员函数queen(),但是queen()中又使用InvalidateRect(NULL)和UpdateWindow()了,要怎么改才正确啊?

UINT WINAPI PRO5::ThreadProc(LPVOID lpParam)
{
PRO5* pPRO5 = (PRO5 *)lpParam;
pPRO5->queen(0,8);
return 0;
}

void PRO5::OnButton2()
{
hThread1=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)PRO5::ThreadProc,NULL,0,NULL);
}

void PRO5::queen(int i, int n)
{
...............
.......
InvalidateRect(NULL); //出错 跨线程!?
UpdateWindow();
......
...............
}


2、第1问不想回答就请帮我看看这个问题
其实我要实现的功能是点一下BUTTON就在界面上画出一组8皇后的解,再点一下画出下一组解,请问还有没有其他的办法能对这个求解过程进行控制,求解的函数就是queen(),算法是教材上的,不加控制会全部画完。虽然弹出一个消息框也能实现控制,但效果感觉不好,弹出来还是在棋盘正中的。
...全文
126 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
zealand_1 2009-12-26
  • 打赏
  • 举报
回复
楼上已有答案了,帮顶
schlafenhamster 2009-12-26
  • 打赏
  • 举报
回复
“实现的功能是点一下BUTTON就在界面上画出一组8皇后的解”,点一下BUTTON先求一组8皇后的解,马上就显示这个解。
MoXiaoRab 2009-12-26
  • 打赏
  • 举报
回复
原来LS的各位都回答了,多次一举了。。。
MoXiaoRab 2009-12-26
  • 打赏
  • 举报
回复
无语。你把窗口类的指针传进线程不就OK了?
strwolf 2009-12-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yxwsbobo 的回复:]
PRO5* lparam; //做初始化分配工作

hThread1=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)PRO5::ThreadProc,lparam,0,NULL);


这样就行了 否则 pPRO5->queen(0,8) 相当于NULL->queen 肯定是访问违规了
[/Quote]
哦 错怪您了
搞了半天 症结就是传掉了 THIS 指针
想多了


strwolf 2009-12-26
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 schlafenhamster 的回复:]
点击一下,执行一次queen()何苦要线程?
[/Quote]

愿闻其详?
hongjn 2009-12-26
  • 打赏
  • 举报
回复
帮顶
schlafenhamster 2009-12-26
  • 打赏
  • 举报
回复
点击一下,执行一次queen()何苦要线程?
cnzdgs 2009-12-26
  • 打赏
  • 举报
回复
hThread1=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)PRO5::ThreadProc,this,0,NULL);
创建线程时把this指针作为参数传给线程,不用UpdateWindow。
strwolf 2009-12-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zyq5945 的回复:]
UINT WINAPI PRO5::ThreadProc(LPVOID  lpParam)
{
      PRO5* pPRO5 = (PRO5 *)lpParam; 
      pPRO5->queen(0,8,lpParam);     
      return  0; 
}

void PRO5::OnButton2()
{
        hThread1=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)PRO5::ThreadProc,this,0,NULL);
}

void PRO5::queen(int i, int n, LPVOID  lpParam)
{
...............
.......
        PRO5* pPRO5 = (PRO5 *)lpParam; 
        pPRO5->InvalidateRect(NULL);       
        pPRO5->UpdateWindow();
......
............... 
}

[/Quote]
我京呼 大神

刚才 看错了 还改了个THIS
对了 我在跑跑看有没有什么异常
没问题马上结帖
strwolf 2009-12-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zyq5945 的回复:]
UINT WINAPI PRO5::ThreadProc(LPVOID  lpParam)
{
      PRO5* pPRO5 = (PRO5 *)lpParam; 
      pPRO5->queen(0,8,lpParam);     
      return  0; 
}

void PRO5::OnButton2()
{
        hThread1=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)PRO5::ThreadProc,this,0,NULL);
}

void PRO5::queen(int i, int n, LPVOID  lpParam)
{
...............
.......
        PRO5* pPRO5 = (PRO5 *)lpParam; 
        pPRO5->InvalidateRect(NULL);       
        pPRO5->UpdateWindow();
......
............... 
}

[/Quote]

还是算出一组解 运行到那两个函数时 出错
yxwsbobo 2009-12-26
  • 打赏
  • 举报
回复
明显是参数问题


如果这个能运行,那说明编译器不好,错误没有检查出来
(PRO5*)NULL->queen(0,8);
zyq5945 2009-12-26
  • 打赏
  • 举报
回复
UINT WINAPI PRO5::ThreadProc(LPVOID lpParam)
{
PRO5* pPRO5 = (PRO5 *)lpParam;
pPRO5->queen(0,8,lpParam);
return 0;
}

void PRO5::OnButton2()
{
hThread1=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)PRO5::ThreadProc,this,0,NULL);
}

void PRO5::queen(int i, int n, LPVOID lpParam)
{
...............
.......
PRO5* pPRO5 = (PRO5 *)lpParam;
pPRO5->InvalidateRect(NULL);
pPRO5->UpdateWindow();
......
...............
}
strwolf 2009-12-26
  • 打赏
  • 举报
回复

void PRO5::queen(int i, int n)
{
...............
.......
InvalidateRect(NULL); //出错 跨线程!?
UpdateWindow();
......
...............
}

楼上 兄弟 你仔细看下我的提问嘛
我都说了 就是 这里错了
这里是显示一组解后刷屏
我注释掉这两个函数就没错


yxwsbobo 2009-12-26
  • 打赏
  • 举报
回复
PRO5* lparam; //做初始化分配工作

hThread1=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)PRO5::ThreadProc,lparam,0,NULL);


这样就行了 否则 pPRO5->queen(0,8) 相当于NULL->queen 肯定是访问违规了
yxwsbobo 2009-12-26
  • 打赏
  • 举报
回复
hThread1=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)PRO5::ThreadProc,NULL,0,NULL);


UINT WINAPI PRO5::ThreadProc(LPVOID lpParam)


// lpParam 是NULL
yxwsbobo 2009-12-26
  • 打赏
  • 举报
回复
up

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧