請問MFC+Thread的問題(急)

opb75124 2008-12-09 02:48:03
我現在用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
...全文
510 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
opb75124 2008-12-10
  • 打赏
  • 举报
回复
回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產生~不是就這樣嗎@_@....
好難啊...
opb75124 2008-12-10
  • 打赏
  • 举报
回复
我也不想用Dialogic語音卡啊...QQ
有其他推薦的卡片嗎? 可以用Delphi或是.NET開發的...而且台灣有代理的...

Q_Q
「已注销」 2008-12-10
  • 打赏
  • 举报
回复
请台湾兄弟用简体。
static_cast 2008-12-09
  • 打赏
  • 举报
回复

GetDlgItem(IDC_STATIC5)->SetWindowText((LPCTSTR)m_TEXTprac5);
改为
SetWindowText(GetDlgItem((HWND)pParam, IDC_STATIC5),(LPCTSTR)m_TEXTprac5);
Conry 2008-12-09
  • 打赏
  • 举报
回复
现在还在用Dialogic語音卡啊,这么老了
想当初在dos下做的ivr就是用的Dialogic語音卡
thenshesaid 2008-12-09
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 opb75124 的回复:]
請問GetDlgItem(GetSafeHwnd (), IDC_STATIC5)這句是要寫在Thread的外面嗎?
但我想是執行到一半時改變文字來顯示狀態...這樣不是該寫在Thread的裡面嗎?
謝謝~
[/Quote]
如果要写在thread里面就无法调用GetSafeHwnd (),因为它是CDialog的成员函数,你需要用其他方法传入HWND
你代码里其实已经有例子, SetWindowText((HWND)pParam,"END dx_blddtcad\n"); 用pParam传入然后强制转换
opb75124 2008-12-09
  • 打赏
  • 举报
回复
樓上...我沒有用ICQ的習慣耶...
e-mail行嗎?
opb75124kimo@yahoo.com.tw
werabcd 2008-12-09
  • 打赏
  • 举报
回复
楼主好像在做语音交换机开发,,你是基于SDK开发的吧,有空聊聊,我也在做.QQ475280128
opb75124 2008-12-09
  • 打赏
  • 举报
回复
請問GetDlgItem(GetSafeHwnd (), IDC_STATIC5)這句是要寫在Thread的外面嗎?
但我想是執行到一半時改變文字來顯示狀態...這樣不是該寫在Thread的裡面嗎?
謝謝~
thenshesaid 2008-12-09
  • 打赏
  • 举报
回复

HWND GetDlgItem( HWND hDlg,
int nIDDlgItem
);

你需要传当前对话框的句柄进去,比如
GetDlgItem(GetSafeHwnd (), IDC_STATIC5)
孤客天涯 2008-12-09
  • 打赏
  • 举报
回复
在线程里是无法直接访问m_TEXTprac5的,把主窗口指针传给线程,线程中通过这个指针访问m_TEXTprac5
opb75124 2008-12-09
  • 打赏
  • 举报
回复
嗯,是台灣沒錯

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

Q_Q
opb75124 2008-12-09
  • 打赏
  • 举报
回复
回 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

不知該如何解決~

感謝
snow_haoxue 2008-12-09
  • 打赏
  • 举报
回复
繁体字~~~

Thread马上跑完,应该是由你自己的程序决定的

报的是什么错误呢
Chivalry 2008-12-09
  • 打赏
  • 举报
回复
呵呵,lz是台湾的啊

繁体字
視窗標題
程式碼
opb75124 2008-12-09
  • 打赏
  • 举报
回复
補貼一下部份程式碼...忘記上傳了

// 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 dialog

IMPLEMENT_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);

}
孤客天涯 2008-12-09
  • 打赏
  • 举报
回复
你VC是什么版本的?m_TEXTprac2是什么数据类型?如果是CString
你改成试试
GetDlgItem(IDC_STATIC2)->SetWindowText((LPCTSTR)m_TEXTprac2);

15,466

社区成员

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

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