VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 278|回复: 6

[已解决]求教老师,创建的线程函数内代码执行异常的问题

[复制链接]
06_avatar_middle
最佳答案
0 
在线会员 发表于 2021-11-30 22:10:36 | 显示全部楼层 |阅读模式
本帖最后由 kingxy 于 2021-12-1 18:00 编辑

感谢 cpp2019和oyxbl对我的帮助!
加上线程同步Event就解决了!

目的:创建了个对话框程序,界面上一个编辑框和一个按钮,本想在编辑框中填写某窗口标题名,然后点按钮通过标题名获取该窗口句柄,接着创建新线程,向该窗口发送按键并延时,反复几次。

代码:
struct sb_struct //声明一个结构
{
        HWND sb_Hwnd;//用来存放窗口句柄
};

UINT _cdecl Threadproc(LPVOID lpParameter)
{
        sb_struct *sb_structTemp1 = (sb_struct *)lpParameter;//传递

        ::SendMessage(sb_structTemp1->sb_Hwnd, WM_KEYDOWN, 49, 0);//有执行 按键1
        Sleep(5000);
        ::SendMessage(sb_structTemp1->sb_Hwnd, WM_KEYDOWN, 50, 0);//没有执行 按键2
        Sleep(5000);
        ::SendMessage(sb_structTemp1->sb_Hwnd, WM_KEYDOWN, 51, 0);//没有执行 按键3
        Sleep(5000);
        ::SendMessage(sb_structTemp1->sb_Hwnd, WM_KEYDOWN, 52, 0);//没有执行 按键4
        Sleep(5000);
        ::SendMessage(sb_structTemp1->sb_Hwnd, WM_KEYDOWN, 53, 0);//没有执行 按键5
        Sleep(8000);
        ::SendMessage(sb_structTemp1->sb_Hwnd, WM_KEYDOWN, 54, 0);//没有执行 按键6
        Sleep(8000);
        ::SendMessage(sb_structTemp1->sb_Hwnd, WM_KEYDOWN, 55, 0);//没有执行 按键7

        AfxMessageBox(_T("次线程,运行到这里!"));  //有弹出  提示窗1
        return 0;
}


void CBUFFRobotDlg::OnBnClickedGo()
{
        // TODO:  在此添加控件通知处理程序代码

        CString sbEdit_String;//预定义字符串变量,用于存放编辑框内容
        GetDlgItemText(IDC_EDIT1, sbEdit_String);//获取编辑框中的内容

        if (sbEdit_String == "")//检测编辑框是否为空
        {
                MessageBox(_T("编辑框不能为空!"));
        }
        else
        {

                HWND sbWindow_HWND;//预声明窗口句柄
                sbWindow_HWND = ::FindWindow(NULL, sb_Edit_String);//获取窗口句柄

                if (sbWindow_HWND != NULL)//如果找到了目标窗口句柄
                {
                        sb_struct      sb_Struct_temp2;  //声明结构,存放窗口句柄
                        sb_Struct_temp2.sb_Hwnd = sbWindow_HWND;//给结构变量赋值上面获取的窗口句柄

                        CWinThread *sb_Thread = AfxBeginThread(Threadproc, &sb_Struct_temp2);//创建线程

                        //MessageBox(_T("按钮事件,运行到这里!"));//有弹出 提示窗2
                }
                else
                {
                        MessageBox(_T("没有发现目标窗口"));
                }
        }
}

现象:当注释掉“提示窗2”时,目标窗口只有第一个按键产生效果,并且“提示窗1”有弹出,估算时间应该所有sleep函数有生效;当不注释掉“提示窗2”时,运行程序,在点掉弹出的“提示窗2”前,目标窗口有7个按键的效果,一旦点掉“提示窗2”后续的发送按键也像不执行了一样没效果,但是还有有“提示窗1”弹出;这个是哪里的问题啊?求教老师,创建的线程函数内代码执行异常的问题
最佳答案
31_avatar_small
2021-12-1 13:49:45
因为 AfxBeginThread 后边的 MessageBox 会阻塞,所以线程有足够的时间执行线程中的语句,
MessageBox 关闭后 OnBnClickedGo() 的生命周期结束,线程中没执行的语句也就不会执行,
注释掉 AfxBeginThread 后边的 MessageBox 同理。

原因已经告诉你了,解决办法不难,自行解决。




上一篇:为什么这个程序运行只能得到一个水仙花数,应该得到四个的呀
下一篇:socket如何传输鼠标的状态信息?
00_avatar_middle
最佳答案
12 
在线会员 发表于 2021-12-1 08:13:39 | 显示全部楼层
有按下没弹起

长按1的情况下

通道被占用无法按2

        ::SendMessage(*hwnd, WM_KEYDOWN, vk, 0);
        Sleep(50);
        ::SendMessage(*hwnd, WM_KEYUP, vk, 0);

评分

参与人数 1驿站币 +1 热心值 +1 收起 理由
06_avatar_small kingxy + 1 + 1 感谢帮助!

查看全部评分

06_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2021-12-1 13:00:50 | 显示全部楼层
oyxbl 发表于 2021-12-1 08:13
有按下没弹起

长按1的情况下

我加上了这样的代码:
        ::SendMessage(sb_mushi_structTemp1->sb_Hwnd, WM_KEYDOWN, 49, 0);
        ::SendMessage(sb_mushi_structTemp1->sb_Hwnd, WM_KEYUP, 49, 0);
谢谢提示,但是现象还是和我上面描述的一样,没有改变。
31_avatar_middle
最佳答案
60 
在线会员 发表于 2021-12-1 13:49:45 | 显示全部楼层    本楼为最佳答案   
bestAnswer
因为 AfxBeginThread 后边的 MessageBox 会阻塞,所以线程有足够的时间执行线程中的语句,
MessageBox 关闭后 OnBnClickedGo() 的生命周期结束,线程中没执行的语句也就不会执行,
注释掉 AfxBeginThread 后边的 MessageBox 同理。

原因已经告诉你了,解决办法不难,自行解决。

评分

参与人数 1驿站币 +1 热心值 +1 收起 理由
06_avatar_small kingxy + 1 + 1 感谢帮助!

查看全部评分

06_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2021-12-1 18:11:17 | 显示全部楼层
cpp2019 发表于 2021-12-1 13:49
因为 AfxBeginThread 后边的 MessageBox 会阻塞,所以线程有足够的时间执行线程中的语句,
MessageBox 关 ...

感谢解惑,加上线程同步Event可以解决,但在子线程执行过程中拖动程序窗口会出现“未响应“情况,直到子线程代码执行结束。原本创建子线程是为了解决sleep导致“未响应“,哈,这又出现了。还有24小时只能评分一次,今天已经给楼上的评分了。
31_avatar_middle
最佳答案
60 
在线会员 发表于 2021-12-2 09:20:20 | 显示全部楼层
kingxy 发表于 2021-12-1 18:11
感谢解惑,加上线程同步Event可以解决,但在子线程执行过程中拖动程序窗口会出现“未响应“情况,直到子 ...


使用等待线程的函数等待线程执行完毕
  1. DWORD WaitForSingleObject(
  2.   [in] HANDLE hHandle,
  3.   [in] DWORD  dwMilliseconds
  4. );

  5. DWORD WaitForMultipleObjects(
  6.   [in] DWORD        nCount,
  7.   [in] const HANDLE *lpHandles,
  8.   [in] BOOL         bWaitAll,
  9.   [in] DWORD        dwMilliseconds
  10. );

  11. DWORD MsgWaitForMultipleObjects(
  12.   [in] DWORD        nCount,
  13.   [in] const HANDLE *pHandles,
  14.   [in] BOOL         fWaitAll,
  15.   [in] DWORD        dwMilliseconds,
  16.   [in] DWORD        dwWakeMask
  17. );
复制代码

06_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2021-12-2 14:11:24 | 显示全部楼层
cpp2019 发表于 2021-12-2 09:20
使用等待线程的函数等待线程执行完毕

谢谢,问题解决了。我用下面的代码替换掉了WaitForSingleObject函数
while (TRUE)
{

        DWORD result;
        MSG msg;

        result = MsgWaitForMultipleObjects(1, &sb_mushiStruct_temp2.sbEvent,FALSE, INFINITE, QS_ALLINPUT);

        if (result == (WAIT_OBJECT_0))
        {
                break;
        }
        else
        {
                PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
                DispatchMessage(&msg);
        }
}
用下面这段代码替换掉了Sleep函数:
VOID Delay(unsigned int msec)//毫秒
{
        time_t start_time, cur_time; // 变量声明
        time(&start_time);
        do {
                time(&cur_time);
       }
        while ((cur_time - start_time)*1000 < msec);
}
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2022-1-21 10:59

Powered by CcTry.CoM

© 2009-2021 cctry.com

快速回复 返回顶部 返回列表