关于使用AfxBeginThread的问题! 不是全局的就必须是静态的……你把this当参数传进去好了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在AfxBeginThread的第二个原型中,可以是一个指向基于CWinThread的类实例的CRuntimeClass指针,这种方法下的线程的消息循环完全是MFC式,很有效且方便编程 其实你定义一个结构,传递地址进去就是了撒在线程中在进行指针转换,这样就不是全局变量了。例子: typedef struct{ _RecordsetPtr pRecordsets; //指向记录集 CListCtrl *m_List; //指向列表控件 int nCurrentRecordPos; //代表当前指针所在的记录}ListRecord; 线程中 ListRecord* ListCtrlRecord; ListCtrlRecord=(ListRecord*)pParam;启动线程处:AfxBeginThread(DisplayRemainRecord, &ListRecordCurrent, THREAD_PRIORITY_NORMAL); 可以用另外一种形式:修改你的类,继承CWinThread要创建线程时就调用从CWinThread派生的类的成员函数CreateThread. 因为类的函数里面多了一个隐含的指针参数,所以编译不通过。改成static 改成static还是用很多限制啊,比如数据库操作,MyDB.CreateInstance(__uuidof(Connection));MySet.CreateInstance(__uuidof(Recordset));这些都通不过,请指教! 其实我想用多线成的初衷是:我在一个对话框里的OnInitDialog函数里做以下操作ShowWindow(SW_SHOWMAXIMIZED);..刷成黑色...MyDB->Open(..);MySet->Open(..);即将对话框最大化并刷成黑色。但是由于执行了数据库操作,在刷成黑色前会有停顿。现在我把数据库操作单独放在另一个函数里(假设为ForDB()),然后PostMessage调用该函数,效果改善了许多。不过发现一个挺奇怪的问题。如果我把ShowWindow(SW_SHOWMAXIMIZED)放在ForDB()里,则对话框启动时首先最大化,但接着有恢复到初始大小。请问这是怎么回事??? 我想了解您的PostMessage是怎样调用的。给点段子出来。 afx_msg void Xfordb();#define WM_FORDB WM_USER+210BEGIN_MESSAGE_MAP(CZimu, CDialog) //{{AFX_MSG_MAP(CZimu) ... //}}AFX_MSG_MAP ON_MESSAGE(WM_FORDB,Xfordb)END_MESSAGE_MAP()PostMessage(WM_FORDB); 接我的上一个问题。我用了PostMessage后,在OnInitDialog里就不能再执行MyDB,MySet的相关操作,否则会出现异常。我的理解是系统对ForDB()里用到的变量采取了保护措施。但是在其他函数里还可以用,哪位大虾给我详细解释一下?谢了 拷!又出问题了。用了PostMessage后,在debug下没问题,在release下就出问题了,大虾们快来啊 好象第一个参数必须是个全局变量,MSDN中有说明 WM_FORDB的处理函数的类型不能为无参数,要有两个参数才行,一个是WPARAM,一个是LPARAM 谢谢老蒋,还希望您能解释一下我的另一个问题:改成static还是有很多限制啊,比如数据库操作,MyDB.CreateInstance(__uuidof(Connection));MySet.CreateInstance(__uuidof(Recordset));这些都通不过,请指教! 有没有CoInitialize?参见http://www.csdn.net/expert/topic/628/628779.xml?temp=.3779413 菜单肿么这么窄?????!!! ListCtrl中含有button的时候 界面闪烁问题 散分(七)祝孩子中考取得好成绩! 怎么在一个分裂视图的CEditView里显示文本呀(没有CDocument支持) 怎样在对话框程序开始运行时,不要资源编辑器设置时窗体的大小,重新设置的窗体大小???? 请教:怎样在应用程序中调用excel,并将已经写好的报表内容转换成excel文件形式? 喝可乐,呵呵 动态生成控件的问题。 MP3解码源程序(核心代码),MPEG4 相关程序和文章,回贴者都有分 请教如何识别从IE拖过来的中文 关于MFC 想在单击树型控件的时候显示ITEM所代表的信息。
在线程中在进行指针转换,这样就不是全局变量了。
例子: typedef struct
{
_RecordsetPtr pRecordsets; //指向记录集
CListCtrl *m_List; //指向列表控件
int nCurrentRecordPos; //代表当前指针所在的记录
}ListRecord;
线程中 ListRecord* ListCtrlRecord;
ListCtrlRecord=(ListRecord*)pParam;
启动线程处:AfxBeginThread(DisplayRemainRecord,
&ListRecordCurrent,
THREAD_PRIORITY_NORMAL);
要创建线程时就调用从CWinThread派生的类的成员函数CreateThread.
改成static
MyDB.CreateInstance(__uuidof(Connection));
MySet.CreateInstance(__uuidof(Recordset));
这些都通不过,请指教!
ShowWindow(SW_SHOWMAXIMIZED);
..刷成黑色...
MyDB->Open(..);
MySet->Open(..);
即将对话框最大化并刷成黑色。
但是由于执行了数据库操作,在刷成黑色前会有停顿。
现在我把数据库操作单独放在另一个函数里(假设为ForDB()),然后PostMessage调用该函数,效果改善了许多。不过发现一个挺奇怪的问题。如果我把ShowWindow(SW_SHOWMAXIMIZED)放在ForDB()里,则对话框启动时首先最大化,但接着有恢复到初始大小。请问这是怎么回事???
//{{AFX_MSG_MAP(CZimu)
...
//}}AFX_MSG_MAP
ON_MESSAGE(WM_FORDB,Xfordb)
END_MESSAGE_MAP()PostMessage(WM_FORDB);
MyDB,MySet的相关操作,否则会出现异常。我的理解是系统对ForDB()里用到的变量采取了保护措施。但是在其他函数里还可以用,哪位大虾给我详细解释一下?谢了
改成static还是有很多限制啊,比如数据库操作,
MyDB.CreateInstance(__uuidof(Connection));
MySet.CreateInstance(__uuidof(Recordset));
这些都通不过,请指教!
参见
http://www.csdn.net/expert/topic/628/628779.xml?temp=.3779413