typedef struct StrcForThread2Tag
{
HWND mydlg;
} StrcForThread;StrcForThread strc_thread; //全局变量void CabcDlg::OnBnClickedStart()
{
HWND mydlg;
mydlg = this->GetSafeHwnd(); char *cc = new char[];;
CEdit *m_edit1 = (CEdit *)GetDlgItem(IDC_FRAME_FROM);
m_edit1->GetLine(0,cc); //这里可以读到cc strc_thread.mydlg = mydlg;
testThread = AfxBeginThread(testThread, &strc_thread);
}UINT testThread (LPVOID pParam)
{
StrcForThread* threadInfo = (StrcForThread*)pParam;
char *cc;
CEdit *m_edit1 = (CEdit *)GetDlgItem(threadInfo->mydlg,IDC_FRAME_FROM);
cc = new char[m_edit1->LineLength(m_edit1->LineIndex(0))];
m_edit1->GetLine(0,cc); //这里读不到cc
}虽然读不到cc,但是线程函数里的mydlg和CabcDlg::OnBnClickedStart里用mydlg = this->GetSafeHwnd();得到的是一样的. 现在我只能直接在OnBnClickedStart里找到m_edit1的句柄,传过去,这样是可以的。。
{
HWND mydlg;
} StrcForThread;StrcForThread strc_thread; //全局变量void CabcDlg::OnBnClickedStart()
{
HWND mydlg;
mydlg = this->GetSafeHwnd(); char *cc = new char[];;
CEdit *m_edit1 = (CEdit *)GetDlgItem(IDC_FRAME_FROM);
m_edit1->GetLine(0,cc); //这里可以读到cc strc_thread.mydlg = mydlg;
testThread = AfxBeginThread(testThread, &strc_thread);
}UINT testThread (LPVOID pParam)
{
StrcForThread* threadInfo = (StrcForThread*)pParam;
char *cc;
CEdit *m_edit1 = (CEdit *)GetDlgItem(threadInfo->mydlg,IDC_FRAME_FROM);
cc = new char[m_edit1->LineLength(m_edit1->LineIndex(0))];
m_edit1->GetLine(0,cc); //这里读不到cc
}虽然读不到cc,但是线程函数里的mydlg和CabcDlg::OnBnClickedStart里用mydlg = this->GetSafeHwnd();得到的是一样的. 现在我只能直接在OnBnClickedStart里找到m_edit1的句柄,传过去,这样是可以的。。
解决方案 »
- dialog bar 各位大哥帮小弟看看,为啥他死都不显示呢?
- 求助:ado向MySQL的BLOB存图像文件怎么多存了一些字节?
- 串口收到数据后,界面上一些数据要更新为收到的新数据,请问怎么做
- 请问qrlvls(空气)?
- 关于串口的打开出错!
- 大家来看看这段程序那有内存泄露,帮帮忙呀.
- 两个视图切换问题
- 怎么用ADO增加修改SQL SERVER中的INT类型?涉及VARIANT
- 各位大虾,为什么我的ToolBar不能和ToolTip关联上?
- 如何编写绘图软件
- vc 写的服务程序,想要让他暂停,该怎么做?
- 绘制win32按钮 一定需要资源吗?有没有一种方法:能在只知道窗口句柄的情况下在上面画按钮
{
CabcDlg *m_pDlg;
}StrcForThread;AfxBeginThread(testThread, this);
typedef struct StrcForThread2Tag
{
CtestDlgDlg *mydlg;
} StrcForThread;StrcForThread strc_thread; //全局变量UINT testThread (LPVOID pParam)
{
StrcForThread* threadInfo = (StrcForThread*)pParam;
char *cc;
CEdit *m_edit1 = (CEdit*)threadInfo->mydlg->GetDlgItem ( IDC_FRAME_FROM ) ;
cc = new char[m_edit1->LineLength(m_edit1->LineIndex(0))];
int len = m_edit1->GetLine(0,cc, m_edit1->LineLength(m_edit1->LineIndex(0))); //这里读不到cc
return 0 ;
}HWND mydlg;
mydlg = this->GetSafeHwnd(); char *cc = new char[];;
CEdit *m_edit1 = (CEdit *)GetDlgItem(IDC_FRAME_FROM);
m_edit1->GetLine(0,cc); //这里可以读到cc strc_thread.mydlg = this;
AfxBeginThread(testThread, &strc_thread);
void CabcDlg::OnBnClickedStart()
{
HWND mydlg;
mydlg = this->GetSafeHwnd();
strc_thread_group.mydlg = mydlg;
strc_thread_group.m_edit2 = m_edit2;
groupingThread = AfxBeginThread(FaceGrouping, &strc_thread_group);
}UINT FaceGrouping(LPVOID pParam)
{
StrcForThreadGroup* threadInfo = (StrcForThreadGroup*)pParam;
char *cc = new char[];
CEdit *m_edit1 = (CEdit *)CFaceAPIDlg::FromHandle(::GetDlgItem(threadInfo->mydlg,IDC_FRAME_FROM));
m_edit1->GetLine(0,cc); CEdit *m_edit2 = threadInfo->m_edit2;
char *cc1 = new char[];
m_edit2->GetLine(0,cc1);
}我刚才把指针和句柄的概念弄混了,不过现在m_edit1和m_edit2的句柄是一样的了(但是指向的地址不同),但两个都无法读到编辑框...
CEdit edit;
edit.Attach(GetDlgItem(threadInfo->mydlg,IDC_FRAME_FROM));
edit.GetLine(XXXX);
edit.Detach();
还是要m_edit1->GetLine(0,cc, m_edit1->LineLength(m_edit1->LineIndex(0)));才行,为什么这里就要指定第三个参数,OnBnClickedStart里就不用指定呢?
(虽然我见过 HWND 与 CWnd* 之间是可以转换的:物理存储的第一个成员就是m_hWnd, 所以可以转换---个人发现。有不准请指正。)所以家下来你应该用 Win32 API来继续操作,除非你 创建一个CWnd类的派生类的对象,然后把那个句柄
attach上,再用那个窗口类对象(or 指针)操作(该指针,指的是对应窗口等UI元素的某操作类的对象的指针,而不是这个控件所对应的 窗口对象(表述这个窗口的数据结构)的指针, 该指针由hWnd索引到)
从两个函数的定义看,三个参数的函数安全性应该更好一些。MFC中,两个函数最终都是调用SendMessage获取字符串。在消息处理线程中,SendMessage直接调用窗口过程,在工作线程中,SendMessage要跨线程,这需要其他的一些处理。我想问题也许是SendMessage直接调用窗口过程对参数要求不是十分严格,跨线程时对参数要求更严格。具体可以跟踪一下,两个函数在MFC中稍有区别,也就是传入的缓冲区的前两个字节的值不同
而CWnd::GetDlgItem就不需要了,直接强制转换...
之所以没在主线程里处理消息是因为我考虑如果有不同的线程函数是不是每个线程函数都要定义一个结构来传不同的参数,这样似乎太累赘,所以我想所有线程只需要接受主对话框指针就完了。不过问题还没解决现在很奇怪的是用
CString cc;
edit.GetLine(0,cc.GetBuffer(), edit.LineLength(edit.LineIndex(0)));
当编辑框里输入多个字符时可以读出,而只有一个字符时就只能读出这个字符来:
edit.GetLine(0,cc.GetBuffer(), edit.LineLength(edit.LineIndex(0))+1);
你的问题到哪,我就到MSDN上查到哪,然后试验一下,没时间细看。