我百思不得其解啊,我如何实现在两个按纽之间进行消息传递呢?我现在一个按纽里开了一个线程,我现在想按下另外一个按纽时给这个按纽传递一个按纽按下消息,让这个按纽把开的这个线程杀掉?我该怎么做呢?

解决方案 »

  1.   

    最简单的用全局变量
    最合理的是用事件等同步对象
    线程里Waitforsingleobject(hEvent....)按钮里SetEvent(hEvent)
    当然,hEvent也是全局的
      

  2.   

    你能帮我把代码结构写一下吗?就是在线程里和在另外一个按纽里应该如何使用事件对象CEvent呢?
      

  3.   

    全局  HANDLE hEvent;
    ...线程
    DWORD WINAPI ThreadProc()
    {
    while(WaitForSingleObject(hEvent,0) != WAIT_OBJECT_0)
    {
    //do something you want}
    //如果跳出while循环,表示结束事件被触发
    return 0;
    }//Another button click event
    ...
    SetEvent(hEvent);
    ...
      

  4.   

    初始化,需要
    hEvent = CreateEvent (NULL, TRUE, FALSE, NULL);
      

  5.   

    static CEvent hEvent;
    我加完之后上面这句代码之后,编译报错说:error C2146: syntax error : missing ';' before identifier 'hEvent'
    C:\vpnInit version1\vpnInitDlg.cpp(51) : fatal error C1004: unexpected end of file found
    Error executing cl.exe.
    这是怎么回事呢?我有分号为什么报错呢?
      

  6.   

    自定义消息 也可以..
    定义个消息,想杀的时候,给那个 按钮发这个消息,那个按钮知道了后,就杀..但是觉得给按钮弄这些操作 有些别扭..为什么给按钮控制而不是主对话框?
    你把这个线程交给主对话框窗口管.
    thread()函数也是在对话框CPP里全局定义的.
    按钮1是负责开启..
    On_button1()
    {
    creatthread();
    }按钮2负责关闭
    On_button2()
    {
    killthread();
    }(代码仅表意思)
    这挺好的?  LZ 是不是有什么特殊需要和要求吗??
      

  7.   

    DWORD WINAPI ThreadProc()
    {
       while(WaitForSingleObject(hEvent,0) != WAIT_OBJECT_0)
      {
    hThread=CreateThread(NULL,0,Start,NULL,0,NULL);
      }
        TerminateThread(hThread,NULL);
    CloseHandle(hThread);
         return 0;
    }
    我在开线程的这个按纽里加了以上的代码之后报错“(246) : error C2601: 'ThreadProc' : local function definitions are illegal。
    这是为什么呢?
      

  8.   

    晕 确定只有这个要求..
    那就用我的那个代码就可以的了..
    主要代码罗列如下:
    CWinThread  *pMyThread;//这个放在CPP的全局里,或者做为对话框成员也行.UINT ThreadProc(LPVOID lparam) //参数就是对话框传过来的信息,这里是对话框指针
    {
     CMyDialog * Mydlg=(CMyDialog *)lparam;
      ----------------------------
      然后就是你自己监视代码;}
    On_Button1()
    {
      pMyThread=::AfxBeginThread(ThreadProc,this);//在这里把对话框的指针传过去
                          //可以实现在线呈里也能操作对话框,或者读取数据;
    }
    OnButton2()
    {
      if(pMyThread->m_hThread==NULL)
    AfxMessageBox("他自己已经关了");
       else
    pMyThread->ExitInstance();//关闭这个线程
    }
    这样就可以了
    有什么问题继续问..
      

  9.   

    无法编译通过怎么办呢?程序报错:“C:\vpnInit version1\vpnInitDlg.cpp(327) : error C2065: 'CMyDialog' : undeclared identifier
    C:\vpnInit version1\vpnInitDlg.cpp(327) : error C2065: 'Mydlg' : undeclared identifier”
    这是怎么回事呢?怎么解决呢?
      

  10.   

    pMyThread=::AfxBeginThread(ThreadProc,this)这个函数里的this指的是什么呢?我窗口上面有两个按纽,一个编辑对话框,我现在是想通过按下按纽1读一个文件并且把文件的内容显示在IDC_EDIT里面,然后在这个按纽里创建一个线程,建立套接字进行监听,现在我按照你上面说的做了,但是我按下按纽1之后文件内容没显示出来,IDC_EDIT控件里面什么也没有,怎么办呢?
      

  11.   

    this 是主对话框的指针,因为On_button是主对话框的函数.   C++里 的语法. ...............
    窗口需要刷新吧..或者你可以用CString s获得一部分内容 AfxMessageBox(s)看下 是不是真的获得值了.那个线程里不是有主窗口的指针么,继续我上面的代码用 Mydlg   CFile f;
     CString s;
     CString temp;
      f.open("1.txt",CFile::modeReadWrite)
      while(1)
    {
       if(!f.read(temp,5))
       {  s+=temp;break;}
       else
          s+=temp;   
     }
    //获得文件,你实现了的话, 可以忽略掉.(Mydlg->GetDlgItem(IDC_EDIT1))->SetWindowText(s);
    (Mydlg->GetDlgItem(IDC_EDIT1))->UpdateWindow();}
      

  12.   

    编译运行出现了Access Violation这是怎么会事呢?
      

  13.   

    emptyness(问题事小,结帐事大~) 说的很对,你把线程放在主对话框中