2012年3月4日

该文被密码保护。 阅读全文

posted @ 2012-03-04 13:58 无忧consume 阅读(3) 评论(0) 推荐(0) 编辑

摘要: 如果回调函数是普通成员函数会出现错误: error C2440: 'type cast' : cannot convert from '' to 'unsigned long (__stdcall *)(void *)' 必须声明为静态成员函数。将成员函数声明为静态虽然可以解决作为线程函数的问题,但是它带来了新的问题,那就是static成员函数只能访问static成员。解决此问题的一种途径是可以在调用类静态成员函数(线程函数)时将this指针作为参数传入,并在改线程函数中用强制类型转换将this转换成指向该类的指针,通过该指针访问非静态成员。 线 阅读全文

posted @ 2012-03-04 02:00 无忧consume 阅读(1360) 评论(0) 推荐(0) 编辑

摘要: 错误为:error C2664: 'CreateThread' : cannot convert parameter 3 from 'void (int)' to 'unsigned long (__stdcall *)(void *)'代码如下:void CMultiThread2Dlg::OnStart(){UpdateData(TRUE);int integer=m_nCount;hThread=CreateThread(NULL,0,ThreadFunc,(VOID*)integer,0,&ThreadID);GetDlgItem 阅读全文

posted @ 2012-03-04 01:56 无忧consume 阅读(1493) 评论(0) 推荐(0) 编辑

摘要: 放置静态控件时必须先建立一个容器,一般是对话框,这时我们在对话框编辑窗口中,从工具窗口中拖出所需控件放在对话框中即可,再适当修改控件ID,设置控件属性,一个静态控件就创建好了,当对话框被显示时,其上的控件也会显示。 静态控件不需要调用Create()函数来创建。动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的。 一、创建动态控件: 为了对照,我们先来看一下静态控件的创建。 而创建动态控件有很大不同,以下以按钮为例,看一下动态控件的创建过程: 1.建立控件ID号: ID号是控件的标识,创建控件前必须先为它设置一个ID号。 打开资源中的“... 阅读全文

posted @ 2012-03-04 01:38 无忧consume 阅读(564) 评论(0) 推荐(0) 编辑

摘要: int WINAPI MessageBoxA(HWND,LPCSTR,LPSTR,UINT); 而WINAPI实际上就是__stdcall.大多数API都采用__stdcall调用规范,这是因为几乎所有的语言都支持__stdcall调用.相比之下,__cdecl只有在C语言中才能用.但是__cdecl调用有一个特点,就是能够实现可变参数的函数调用,比如printf,这用__stdcall调用是不可能的. __fastcall这种调用规范比较少见,但是在Borland C++ Builder中比较多的采用了这种调用方式.如果有共享代码的需要,比如写DLL,推荐的方法是用__std... 阅读全文

posted @ 2012-03-04 01:32 无忧consume 阅读(162) 评论(0) 推荐(0) 编辑

摘要: 解决方法:将C:\Program Files\Microsoft Visual Studio 6\Common\MSDev98\Bin下的mspdb60.dll文件拷贝到C:\Program Files\Microsoft Visual Studio 6\VC98\Bin目录下即可 阅读全文

posted @ 2012-03-04 00:42 无忧consume 阅读(220) 评论(0) 推荐(0) 编辑

摘要: 下载源代码八、线程的同步 虽然多线程能给我们带来好处,但是也有不少问题需要解决。例如,对于像磁盘驱动器这样独占性系统资源,由于线程可以执行进程的任何代码段,且线程的运行是由系统调度自动完成的,具有一定的不确定性,因此就有可能出现两个线程同时对磁盘驱动器进行操作,从而出现操作错误;又例如,对于银行系统的计算机来说,可能使用一个线程来更新其用户数据库,而用另外一个线程来读取数据库以响应储户的需要,极有可能读数据库的线程读取的是未完全更新的数据库,因为可能在读的时候只有一部分数据被更新过。 使隶属于同一进程的各线程协调一致地工作称为线程的同步。MFC提供了多种同步对象,下面我们只介绍最常用的四种.. 阅读全文

posted @ 2012-03-04 00:30 无忧consume 阅读(105) 评论(0) 推荐(0) 编辑

摘要: 下载源代码七、线程间通讯 一般而言,应用程序中的一个次要线程总是为主线程执行特定的任务,这样,主线程和次要线程间必定有一个信息传递的渠道,也就是主线程和次要线程间要进行通信。这种线程间的通信不但是难以避免的,而且在多线程编程中也是复杂和频繁的,下面将进行说明。使用全局变量进行通信由于属于同一个进程的各个线程共享操作系统分配该进程的资源,故解决线程间通信最简单的一种方法是使用全局变量。对于标准类型的全局变量,我们建议使用volatile 修饰符,它告诉编译器无需对该变量作任何的优化,即无需将它放到一个寄存器中,并且该值可被外部改变。如果线程间所需传递的信息较复杂,我们可以定义一个结构,通过传递. 阅读全文

posted @ 2012-03-04 00:28 无忧consume 阅读(156) 评论(0) 推荐(0) 编辑

摘要: http://www.vckbase.com/document/viewdoc/?id=1706下载源代码五、MFC对多线程编程的支持 MFC中有两类线程,分别称之为工作者线程和用户界面线程。二者的主要区别在于工作者线程没有消息循环,而用户界面线程有自己的消息队列和消息循环。 工作者线程没有消息机制,通常用来执行后台计算和维护任务,如冗长的计算过程,打印机的后台打印等。用户界面线程一般用于处理独立于其他线程执行之外的用户输入,响应用户及系统所产生的事件和消息等。但对于Win32的API编程而言,这两种线程是没有区别的,它们都只需线程的启动地址即可启动线程来执行任务。 在MFC中,一般用全... 阅读全文

posted @ 2012-03-04 00:26 无忧consume 阅读(126) 评论(0) 推荐(0) 编辑

摘要: http://www.vckbase.com/document/viewdoc/?id=1704下载源代码(E:\program\mazhen\web program)一、问题的提出编写一个耗时的单线程程序: 新建一个基于对话框的应用程序SingleThread,在主对话框IDD_SINGLETHREAD_DIALOG添加一个按钮,ID为IDC_SLEEP_SIX_SECOND,标题为“延时6秒”,添加按钮的响应函数,代码如下:void CSingleThreadDlg::OnSleepSixSecond() { Sleep(6000); //延时6秒} 编译并运行应用程序,单击“延时6秒.. 阅读全文

posted @ 2012-03-04 00:25 无忧consume 阅读(115) 评论(0) 推荐(0) 编辑


Copyright © 2024 无忧consume
Powered by .NET 8.0 on Kubernetes