将下列代码存入名字任取的文件, 如: th.cpp
在yc++中, 用<文件\打开或创建cpp源程序>调入th.cpp, 再用 <工具\执行>运行th.cpp
或在dos中, 用 ycc th.cpp 生成 th.exe, 再运行th.exe
在vc++中, 用 cl th.cpp 生成 th.exe, 再运行th.exe
////////////////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef YCC
#include <windows.h>
#include "include\ycapi.h"
#pragma comment(lib, "gdi32.lib")
#pragma comment(lib, "user32.lib")
#pragma comment(lib, "yxbapi.lib")
#endif
////////////////////////////////////////////////////////////////////////////////////////////////////////////
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
/////////创建主窗口. 用YC++的API函数创建, 它不需要注册.
int WINAPI MainWndProc(HWND hwnd,UINT iMessage,UINT wParam,LONG lParam,void *pUserData);
HWND hwnd = YXB_Window(MainWndProc,NULL,0,
WS_OVERLAPPEDWINDOW | WS_CAPTION | WS_SYSMENU,
"多线程",110,50,800,600,NULL,WT_WIN);
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
int WINAPI MainWndProc(HWND hwnd,UINT iMessage,UINT wParam,LONG lParam,void *pUserData)
{
static HANDLE linep_thread_handle,rectp_thread_handle;
switch(iMessage)
{
case WM_DESTROY:
TerminateThread(linep_thread_handle,0);
CloseHandle(linep_thread_handle);
TerminateThread(rectp_thread_handle,0);
CloseHandle(rectp_thread_handle);
PostQuitMessage(0);
return FALSE;
case WM_CREATE:
DWORD linep_thread_ret, rectp_thread_ret;
void draw_linep(LPVOID *my_buf), draw_rectp(LPVOID *my_buf);
linep_thread_handle = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)draw_linep,hwnd,0,&linep_thread_ret);
rectp_thread_handle = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)draw_rectp,hwnd,0,&rectp_thread_ret);
return FALSE;
case WM_PAINT:
PAINTSTRUCT ps;
BeginPaint(hwnd, &ps);
YIMG yimg;
memset(&yimg,0,sizeof YIMG);
yimg.hdc = ps.hdc; //通过这个设置, 可以将窗口客户区当作一幅图象来操作
RECT mRect;
GetClientRect(hwnd, &mRect);
YXB_ImageFill(&yimg, 0, 0, mRect.right, mRect.bottom, RGB(130,150,160));
EndPaint(hwnd, &ps);
return FALSE;
}
return DefWindowProc(hwnd,iMessage,wParam,lParam);
}
const int mycolor[]={0xff7766,0xcc88ff,0x6688aa,0xcc9977,0x88ff11,0x779911,0xdd88aa,0x55ccff};
void draw_linep(LPVOID *my_buf)
{
static int xx0=388,yy0=200;
HWND hwnd = (HWND)my_buf;
HDC hdc = GetDC(hwnd);
RECT mRect;
GetClientRect(hwnd, &mRect);
MoveToEx(hdc,0,0,NULL);
for(int ii=0; ; ii++)
{
HPEN hPen = CreatePen(PS_SOLID, 3, mycolor[ii%8]);
HPEN hpenSave = (HPEN)SelectObject (hdc, hPen);
LineTo(hdc,xx0,yy0);
xx0 = rand()*mRect.right/2/RAND_MAX;
yy0 = rand()*mRect.bottom/RAND_MAX;
SelectObject (hdc, hpenSave);
DeleteObject(hPen);
Sleep(10);
}
ReleaseDC(hwnd,hdc);
}
void draw_rectp(LPVOID *my_buf)
{
static int xx0=0,yy0=0;
HWND hwnd = (HWND)my_buf;
HDC hdc = GetDC(hwnd);
RECT mRect;
GetClientRect(hwnd, &mRect);
for(int ii=0; ; ii++)
{
HBRUSH hbr = (HBRUSH)SelectObject(hdc,CreateSolidBrush(mycolor[ii%8]));
PatBlt(hdc,xx0,yy0,30,30,PATCOPY);
DeleteObject(SelectObject(hdc,hbr));
xx0 = rand()*mRect.right/2/RAND_MAX + mRect.right/2;
yy0 = rand()*mRect.bottom/RAND_MAX;
Sleep(10);
}
ReleaseDC(hwnd,hdc);
}
#include <iostream>
#include <windows.h>
using namespace std;
// 线程函数,间隔1秒循环打印分配给线程的序号
DWORD OnThread(LPVOID pvParam)
{
int nID = (int)pvParam;
while(true)
{
cout << nID << endl;
Sleep(1000);
};
return 0;
}
int main()
{
DWORD dwThreadID = 0;
// 创建5个线程,每个线程传一个序号作为参数
for(int i = 0; i < 5; i++)
{
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)OnThread, (void*)i, 0, &dwThreadID);
}
// 按了任意键则执行下一句
system("pause");
return 0;
}
我有侯捷译的《Win32多线程程序设计》的配套源代码,里面有30多个例程,发给你吧。
里面都有详细的英文注释。
多线程WIN32程序如何检查死锁(一)~
数据毁坏或一个死锁几乎是一个多线程应用中发生的最坏的问题,它具有非常恶毒的和敏感的形式但相当困难重新或者被跟踪。由于这种原因,强烈推荐你在这些情况发生之前分析你的多线程应用程序可能的死锁条件并检查和删除这些死锁。
进程是应用程序的执行实例,每个进程是由私有的虚拟地址空间、代码、数据和其它各种系统资源组成,进程在运行过程中创建的资源随着进程的终止而被销毁,所使用的系统资源在进程终止时被释放或关闭。
线程是进程内部的一个执行单元。系统创建好进程后,实际上就启动执行了该进程的主执行线程,主执行线程以函数地址形式,比如说main或WinMain函数,将程序的启动点提供给Windows系统。主执行线程终止了,进程也就随之终止。
每一个进程至少有一个主执行线程,它无需由用户去主动创建,是由系统自动创建的。用户根据需要在应用程序中创建其它线程,多个线程并发地运行于同一个进程中。一个进程中的所有线程都在该进程的虚拟地址空间中,共同使用这些虚拟地址空间、全局变量和系统资源,所以线程间的通讯非常方便,多线程技术的应用也较为广泛。
多线程可以实现并行处理,避免了某项任务长时间占用CPU时间。要说明的一点是,目前大多数的计算机都是单处理器(CPU)的,为了运行所有这些线程,操作系统为每个独立线程安排一些CPU时间,操作系统以轮换方式向线程提供时间片,这就给人一种假象,好象这些线程都在同时运行。由此可见,如果两个非常活跃的线程为了抢夺对CPU的控制权,在线程切换时会消耗很多的CPU资源,反而会降低系统的性能。这一点在多线程编程时应该注意。
Win32 SDK函数支持进行多线程的程序设计,并提供了操作系统原理中的各种同步、互斥和临界区等操作。Visual C++ 6.0中,使用MFC类库也实现了多线程的程序设计,使得多线程编程更加方便。
Win32 API对多线程编程的支持
Win32 提供了一系列的API函数来完成线程的创建、挂起、恢复、终结以及通信等工作。下面将选取其中的一些重要函数进行说明。
1、HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,
DWORD dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId);
该函数在其调用进程的进程空间里创建一个新的线程,并返回已建线程的句柄,其中各参数说明如下:
lpThreadAttributes:指向一个 SECURITY_ATTRIBUTES 结构的指针,该结构决定了线程的安全属性,一般置为 NULL;
dwStackSize:指定了线程的堆栈深度,一般都设置为0;
lpStartAddress:表示新线程开始执行时代码所在函数的地址,即线程的起始地址。一般情况为(LPTHREAD_START_ROUTINE)ThreadFunc,ThreadFunc 是线程函数名;
lpParameter:指定了线程执行时传送给线程的32位参数,即线程函数的参数;
dwCreationFlags:控制线程创建的附加标志,可以取两种值。如果该参数为0,线程在被创建后就会立即开始执行;如果该参数为CREATE_SUSPENDED,则系统产生线程后,该线程处于挂起状态,并不马上执行,直至函数ResumeThread被调用;
lpThreadId:该参数返回所创建线程的ID;如果创建成功则返回线程的句柄,否则返回NULL。
2、DWORD SuspendThread(HANDLE hThread);
该函数用于挂起指定的线程,如果函数执行成功,则线程的执行被终止。
3、DWORD ResumeThread(HANDLE hThread);
该函数用于结束线程的挂起状态,执行线程。
4、VOID ExitThread(DWORD dwExitCode);
该函数用于线程终结自身的执行,主要在线程的执行函数中被调用。其中参数dwExitCode用来设置线程的退出码。
5、BOOL TerminateThread(HANDLE hThread,DWORD dwExitCode);
一般情况下,线程运行结束之后,线程函数正常返回,但是应用程序可以调用TerminateThread强行终止某一线程的执行。各参数含义如下:
hThread:将被终结的线程的句柄;
dwExitCode:用于指定线程的退出码。
使用TerminateThread()终止某个线程的执行是不安全的,可能会引起系统不稳定;虽然该函数立即终止线程的执行,但并不释放线程所占用的资源。因此,一般不建议使用该函数。
6、BOOL PostThreadMessage(DWORD idThread,
UINT Msg,
WPARAM wParam,
LPARAM lParam);
该函数将一条消息放入到指定线程的消息队列中,并且不等到消息被该线程处理时便返回。
idThread:将接收消息的线程的ID;
Msg:指定用来发送的消息;
wParam:同消息有关的字参数;
lParam:同消息有关的长参数;
调用该函数时,如果即将接收消息的线程没有创建消息循环,则该函数执行失败。
另外,站长团上有产品团购,便宜有保证
#14782359877#
Win32多线程的基于CPU的计算和基于I/O的计算 - ******
#门姣# 对于一个单个的线程,决定所给定的计算是否是一个优秀的方案的最重要因素是,该计算是一个基于CPU的计算还是基于I/O的计算.基于CPU的计算是指这种计算的大多数时间CPU都非常“忙”.典型的基于CPU的计算如下:复杂的数学计算...
#14782359877#
急需一个WIN32 API编程的电子时钟或者windows自带的小程序(除计算器和文本)代码 ******
#门姣# #include<graphics.h> #include<math.h> #include<dos.h> #define pi 3.1415926 #define X(a,b,c) x=a*cos(b*c*pi/180-pi/2)+300; #define Y(a,b,c) y=a*sin(b*c*pi/180-pi/2)+240; #define d(a,b,c) X(a,b,c);Y(a,b,c);line(300,240,x,y) void init(...
#14782359877#
线程之间的通信例子 求一个WINDOWS下多线程间通信的例子,用C语言编写! - ******
#门姣# #include <stdio.h> int main(int argc, char **argv){ CreateThread(NULL, 0, thread2, this, 0, 0); printf("主线程正在执行!\n"); return 0; } void thread2(){ sleep(2);//睡2毫秒 printf("第二个线程在运行!\n"); } 这个例子可能很简单,但能说明问题了.
#14782359877#
多线程的详解? ******
#门姣# 每个正在系统上运行的程序都是一个进程.每个进程包含一到多个线程.进程也可能是整个程序或者是部分程序的动态执行.线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行.也可以把它理解为代码运行的上下文.所以...
#14782359877#
用汇编语言编写一个小程序(比如hello,word!)请懂的人帮忙提供源码 - ******
#门姣# 您正在看的汇编语言是:hello,world!win32汇编小程序. 首先我们看一个“复杂”的Win32汇编程序 程序用来显示一个消息框 -------------------------------------------------- ;文件名:3.asm .386 .model flat ,stdcall NULL equ 0 MB_OK equ 0 ExitProcess ...
#14782359877#
求VB6多线程源码 - ******
#门姣# 方法 1 : CreateThread 不用多说,万变不离其宗,这是 Win32 内创建线程的唯一系统方法,以下介绍的多线程创建方式虽然不直 接接触这个 Win32 APi,但系统也是通过他创建的.方法 2 : TimerSetEvent 这个函数是 Win32 系统的一个高精度计...
#14782359877#
写一个线程小程序,启动线程,让其打印输出5行数,分别是1,2,3,4,5 - ******
#门姣# public class Thread3 implements Runnable{ private int number; private int count; public static void main(String[] args) {for(int i=1;i new Thread(new Thread3(i)).start(); } public void run() { while(true) { System.out.println("线程 " + number + ":计...
#14782359877#
求一个简单的win32TCP程序 ******
#门姣# 假定有三台电脑分别是 Computer01 Computer02 Computer03 用户分别是 \\Computer01\User01 \\Computer02\User02 \\Computer03\User03 \\Computer01\User01 想把自己的 \\Computer01\movie 只共享给 \\Computer02\User02,而\\Computer03\...
#14782359877#
win32编程中多线程同步有哪些 - ******
#门姣# 一.线程间数据通信 系统从进程的地址空间中分配内存给线程栈使用.新线程与创建它的线程在相同的进程上下文中运行.因此,新线程可以访问进程内核对象的所有句柄、进程中的所有内存以及同一个进程中其他所有线程的栈.这样一来,同...
#14782359877#
设计一个程序,两个线程 - ******
#门姣# /** * 楼主,这个调试通过没问题的 Main.java */ public class Main{ int i = 1; public static void main(String[] args){ Main m = new Main(); new Thread(new Increate(m)).start(); new Thread(new Decrease(m)).start(); } public static void sleep(){ try{ Thread...