我現在用MFC Dialog類別~配合Dialogic語音卡使用(這邊寫成Thread)
想做到當我按下"start"按鈕後開始跑語音卡的Thread~
但是我Thread馬上就跑完了~要怎麼讓它能夠正常的執行完一個動作再跳下一步?(例如,如果沒寫成Thread就能等待電話>>接起後才播放語音...等,但就會連取消或關視窗的按鈕都不能按)還有~我的STATIC LABEL要怎麼在Thread中改變顯示文字呢?我現在只知道用 SetWindowText((HWND)pParam,"PLAY VOX"); 這樣改視窗標題~但我想改的是STATIC LABEL文字
若在 UINT MyThreadProc( LPVOID pParam ) 中使用 
m_TEXTprac2="Thread Started";
GetDlgItem(IDC_STATIC2)->SetWindowText(m_TEXTprac2); 則會顯示傳入參數錯誤...我實在不會VC++...但Dialogic語音卡又必須用C/C++開發...請大家幫忙了~謝謝Q_Q

解决方案 »

  1.   

    你VC是什么版本的?m_TEXTprac2是什么数据类型?如果是CString 
    你改成试试
    GetDlgItem(IDC_STATIC2)->SetWindowText((LPCTSTR)m_TEXTprac2);
      

  2.   

    補貼一下部份程式碼...忘記上傳了// noDDEDlg.cpp : implementation file
    //#include "stdafx.h"
    #include "noDDE.h"
    #include "noDDEDlg.h"
    #include "DlgProxy.h"
    #include <srllib.h>  //注意:srllib.h必須放在dxxxlib.h之前
    #include <dxxxlib.h>
    #include <time.h>#ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
    HWND hWndSecond; //for thread
    HANDLE hEvent1; //for thread
    int count; //for timer
    CString ServerData; //for timer
    int dev; //for Dialogic
    DV_TPT tpt;//for Dialogic
    DV_DIGIT dig;//for Dialogic
     
    // CNoDDEDlg dialogIMPLEMENT_DYNAMIC(CNoDDEDlg, CDialog); 
    UINT MyThreadProc( LPVOID pParam )
    {
    while(TRUE){

    SetWindowText((HWND)pParam,"in MyThreadProc");  
    Sleep(1000);
    WaitForSingleObject(hEvent1, 5000);  //****IVR********************
    dx_clrtpt(&tpt,1);
    tpt.tp_type = IO_EOT;
    tpt.tp_termno = DX_MAXDTMF;
    tpt.tp_length = 1; //對方按數字長度 會結束播放語音
    tpt.tp_flags = TF_MAXDTMF; SetWindowText((HWND)pParam,"PLAY VOX");

         
    dx_playf(dev,"C:\\Program Files\\Dialogic\\demos\\voice\\VoiceDemo\\VoiceDemo.vox",&tpt,EV_SYNC); //直接使用demo的vox語音檔

    //接收電話按鍵(4個數字) /* setup TPT to wait for 3 digits and terminate */ dx_clrtpt(&tpt, 1); tpt.tp_type =   IO_EOT; tpt.tp_termno = DX_MAXDTMF; tpt.tp_length = 4;   //決定數字個數! tpt.tp_flags =  TF_MAXDTMF;   /* enable DPD and DTMF digits */
    dx_setdigtyp(dev, D_DPDZ|D_DTMF); /* clear the digit buffer */
    dx_clrdigbuf(dev);   
    /* collect 3 digits from the user */   if (dx_getdig(dev, &tpt, &dig, EV_SYNC) == -1) {      /* error, display error message */ //     SetWindowText((HWND)pParam,"dx_getdig error %d, %s\n", ATDV_LASTERR(dev), ATDV_ERRMSGP(dev));
    SetWindowText((HWND)pParam, "Received ERROR");   } 
       else {      /* display digits received and digit type */  //    MessageBox("Received \"%s\"\n", dig.dg_value);
    SetWindowText((HWND)pParam, "Received");
       }//end of else
       if ( dx_blddtcad( 102, 400, 107, 400, 107, 300 , 290, 530, 450, 3 ) == -1 ) 
       {  
          SetWindowText((HWND)pParam, "Unable to build a Dual Tone Cadence" );  
          SetWindowText((HWND)pParam, " Template\n");  
       }     SetWindowText((HWND)pParam,"END dx_blddtcad\n"); dx_sethook(dev,DX_ONHOOK,EV_SYNC); SetWindowText((HWND)pParam,"掛電話123!\n");
    dx_close(dev); //****IVR********************
    return 0; //????????????似乎不加就會吃掉資源
    } return 0; // thread completed successfully
    }CNoDDEDlg::CNoDDEDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CNoDDEDlg::IDD, pParent)
    {
    //{{AFX_DATA_INIT(CNoDDEDlg)
    m_TEXTprac1 = _T("");
    m_TEXTprac2 = _T("");
    m_TEXTprac3 = _T("");
    m_TEXTprac4 = _T("");
    m_edit = _T("");
    //}}AFX_DATA_INIT
    // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    m_pAutoProxy = NULL;
    }void CNoDDEDlg::OnOK() 
    {
    m_TEXTprac2="Thread Started";
    GetDlgItem(IDC_STATIC2)->SetWindowText(m_TEXTprac2); 
    AfxBeginThread(MyThreadProc,(LPVOID)GetSafeHwnd());
    }void CNoDDEDlg::OnCancel() 
    {
    m_TEXTprac4="CLOSE";
    GetDlgItem(IDC_STATIC4)->SetWindowText(m_TEXTprac4); //!!!! dx_sethook(dev,DX_ONHOOK,EV_SYNC);
    SetWindowText("掛電話!\n");
    dx_close(dev);
    if (CanExit())
    CDialog::OnCancel();
    }void CNoDDEDlg::OnDestroy() 
    {
    CDialog::OnDestroy(); KillTimer(1);//關掉計時器
    dx_sethook(dev,DX_ONHOOK,EV_SYNC);
    SetWindowText("掛電話!\n");
    dx_close(dev);
    }void CNoDDEDlg::OnChangeEdit1() 
    { UpdateData(); GetDlgItem(IDC_STATIC3)->SetWindowText(m_edit); }
      

  3.   

    繁体字~~~Thread马上跑完,应该是由你自己的程序决定的报的是什么错误呢
      

  4.   

    回 jason_wentzel我用VC6~
    m_TEXTprac2是用Class Wizard產生,IDC_STATIC的variable若我在UINT MyThreadProc( LPVOID pParam ) 

    GetDlgItem(IDC_STATIC5)->SetWindowText((LPCTSTR)m_TEXTprac5);
    會出現以下錯誤
    error C2660: 'GetDlgItem' : function does not take 1 parameters
    error C2227: left of '->SetWindowTextA' must point to class/struct/union
    error C2065: 'm_TEXTprac5' : undeclared identifier不知該如何解決~感謝
      

  5.   

    嗯,是台灣沒錯請問如果要一步一步執行下去
    可以直接像consloe程式那像把全部東西都寫在thread裡嗎?
    還是要切開成functions...Q_Q
      

  6.   

    在线程里是无法直接访问m_TEXTprac5的,把主窗口指针传给线程,线程中通过这个指针访问m_TEXTprac5
      

  7.   


    HWND GetDlgItem(          HWND hDlg,
        int nIDDlgItem
    );你需要传当前对话框的句柄进去,比如
    GetDlgItem(GetSafeHwnd (), IDC_STATIC5)
      

  8.   

    請問GetDlgItem(GetSafeHwnd (), IDC_STATIC5)這句是要寫在Thread的外面嗎?
    但我想是執行到一半時改變文字來顯示狀態...這樣不是該寫在Thread的裡面嗎?
    謝謝~
      

  9.   

    楼主好像在做语音交换机开发,,你是基于SDK开发的吧,有空聊聊,我也在做.QQ475280128
      

  10.   

    樓上...我沒有用ICQ的習慣耶...
    e-mail行嗎?
    [email protected]
      

  11.   

    如果要写在thread里面就无法调用GetSafeHwnd (),因为它是CDialog的成员函数,你需要用其他方法传入HWND
    你代码里其实已经有例子, SetWindowText((HWND)pParam,"END dx_blddtcad\n"); 用pParam传入然后强制转换
      

  12.   

    现在还在用Dialogic語音卡啊,这么老了
    想当初在dos下做的ivr就是用的Dialogic語音卡
      

  13.   


    GetDlgItem(IDC_STATIC5)->SetWindowText((LPCTSTR)m_TEXTprac5); 
    改为
    SetWindowText(GetDlgItem((HWND)pParam, IDC_STATIC5),(LPCTSTR)m_TEXTprac5);
      

  14.   

    我也不想用Dialogic語音卡啊...QQ
    有其他推薦的卡片嗎? 可以用Delphi或是.NET開發的...而且台灣有代理的...Q_Q
      

  15.   

    回static_cast
    我把GetDlgItem(IDC_STATIC5)->SetWindowText((LPCTSTR)m_TEXTprac5);
    打在UINT MyThreadProc( LPVOID pParam )
    {
    while(TRUE){

    底下~會顯示
     error C2065: 'm_TEXTprac5' : undeclared identifier因為'm_TEXTprac5'是在
    CNoDDEDlg::CNoDDEDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CNoDDEDlg::IDD, pParent)
    {
    //{{AFX_DATA_INIT(CNoDDEDlg)
    m_TEXTprac1 = _T("");
    m_TEXTprac2 = _T("");
    m_TEXTprac3 = _T("");
    m_TEXTprac4 = _T("");
    m_TEXTprac5 = _T("");
    m_TEXTprac6 = _T("");
    m_edit = _T("");
    //}}AFX_DATA_INIT
    // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    m_pAutoProxy = NULL;
    }的關係嗎?可是用Class Wizard產生~不是就這樣嗎@[email protected]
    好難啊...