我現在用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
想做到當我按下"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
你改成试试
GetDlgItem(IDC_STATIC2)->SetWindowText((LPCTSTR)m_TEXTprac2);
//#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); }
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不知該如何解決~感謝
可以直接像consloe程式那像把全部東西都寫在thread裡嗎?
還是要切開成functions...Q_Q
HWND GetDlgItem( HWND hDlg,
int nIDDlgItem
);你需要传当前对话框的句柄进去,比如
GetDlgItem(GetSafeHwnd (), IDC_STATIC5)
但我想是執行到一半時改變文字來顯示狀態...這樣不是該寫在Thread的裡面嗎?
謝謝~
e-mail行嗎?
[email protected]
你代码里其实已经有例子, SetWindowText((HWND)pParam,"END dx_blddtcad\n"); 用pParam传入然后强制转换
想当初在dos下做的ivr就是用的Dialogic語音卡
GetDlgItem(IDC_STATIC5)->SetWindowText((LPCTSTR)m_TEXTprac5);
改为
SetWindowText(GetDlgItem((HWND)pParam, IDC_STATIC5),(LPCTSTR)m_TEXTprac5);
有其他推薦的卡片嗎? 可以用Delphi或是.NET開發的...而且台灣有代理的...Q_Q
我把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產生~不是就這樣嗎@_@....
好難啊...