虽然点不多,只给一点表示谢意.但问题对我来说很难!研究了一天也没有结果,看下面的正题吧

jxw1987628 2007-10-09 10:30:18
//先给出异常的地方 这里会弹出一个错误 :UnHandled exception avocess..0xccccc 之类的窗口
try
{
hwnd=CreateWindow(szAppName,"MultiPleUIThread",WS_OVERLAPPEDWINDOW,0,0,400,600,NULL,NULL,hInstance,NULL);
set_terminate(mytest);
throw"##################!";
}
catch(...)
{
cout<<"error! here....."<<endl;
}
////////////////////////////////////////////////////////////////
//下面是所有源代码: 并附有详细注释!
程序主要做的是:
在主窗体中创建4个相同的子窗体,在创建每个子窗体时启动每个字窗体对应的线程,其窗口一样,线呈函数里的代码也一样
是纯Win32Application程序!

请先不要判定是创建窗体错误,那里单步调试的时候总会执行catch语句的...........

///////////////////////////////////////////////////////////////////
// UIMutiThread.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
LRESULT APIENTRY WndProc(HWND hwnd,UINT iMsg,WPARAM wParam,LPARAM lParam);//窗口消息函数声明
///////////////////////////////////////////////////////////////////////////
HANDLE hThread[4]; //全局线程句柄数组
///////////////////////////////////////////////////////////////////////////

void mytest()
{}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{




static char szAppName[]="MultiThread";
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
WNDPROC WndProc;

wndclass.style=CS_HREDRAW|CS_VREDRAW;
wndclass.lpfnWndProc=WndProc;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hInstance=hInstance;
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);

wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszClassName=szAppName;
wndclass.lpszMenuName=NULL;

int a=RegisterClass(&wndclass);
if(!a)
cout<<"error here!\n"<<GetLastError()<<endl;
try
{
hwnd=CreateWindow(szAppName,"MultiPle UI Thread",WS_OVERLAPPEDWINDOW,0,0,400,600,NULL,NULL,hInstance,NULL);
set_terminate(mytest);
throw"##################!";
}
catch(...)
{
cout<<"error! here....."<<endl;
}

if(hwnd==NULL)
cout<<"error here!\n"<<GetLastError()<<endl;

ShowWindow(hwnd,nCmdShow);
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);


}
return msg.wParam;
}

LRESULT APIENTRY WndProc(HWND hwnd,UINT iMsg,WPARAM wParam,LPARAM lParam)//主线程窗口消息处理函数
{

typedef LRESULT CALLBACK MyWndProc(HWND,UINT,WPARAM,LPARAM);//函数原形声明
MyWndProc *WndProc1 = NULL,*WndProc2 = NULL,*WndProc3=NULL,*WndProc4=NULL;//函数指针
static char *szChildClass[]={"Child1","Child2","Child3","Child4"};//子窗口类名数组
static HWND hwndChild[4];//字窗口句柄数组
HINSTANCE hInstance;

WNDPROC ChildProc[]={WndProc1,WndProc2,WndProc3,WndProc4};//函数指针数组
int i,cxClient,cyClient;//存储窗口尺寸变量
WNDCLASSEX wndclass;
switch(iMsg)
{
case WM_CREATE :
hInstance=(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);
wndclass.cbSize=sizeof(wndclass);
wndclass.style=CS_HREDRAW|CS_VREDRAW;
wndclass.cbClsExtra=0;
wndclass.hInstance=hInstance;
wndclass.hIcon=NULL;
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.hIconSm=NULL;
wndclass.cbWndExtra=0;
wndclass.lpszMenuName=NULL;

for(i=0;i<4;i++)
{
wndclass.lpfnWndProc=ChildProc[i];
wndclass.lpszClassName=szChildClass[i];
RegisterClassEx(&wndclass);
hwndChild[i]=CreateWindow(szChildClass[i],NULL,WS_CHILDWINDOW|WS_BORDER|WS_VISIBLE,0,0,0,0,hwnd,(HMENU)i,hInstance,NULL);

}


return 0;

case WM_SIZE:
cxClient=LOWORD(lParam);
cyClient=HIWORD(wParam);
for( i=0;i<4;i++)
MoveWindow(hwndChild[i],(i%2)*cxClient/2,(i>1)*cyClient/2,cxClient/2,cyClient/2,TRUE);
return 0;

case WM_CHAR:
if(wParam=='q')
DestroyWindow(hwnd); //输入'q'时退出应用程序
return 0;
case WM_DESTROY:
PostQuitMessage(0);
for(int i=0;i<4;i++)
CloseHandle(hThread[i]);
return 0;
}
return DefWindowProc(hwnd,iMsg,wParam,lParam);
}

//自定义结构体传递参数
typedef struct
{
HWND hwnd;
int cxClient;
int cyClient;
int cyChar;
BOOL bKill;
}PARAMS,*PPARAMS;


//全局线程函数的声明
unsigned long __stdcall Thread1(PVOID pvoid);//子窗口一的线程函数,产生素数并输出
unsigned long __stdcall Thread2(PVOID pvoid);//其余和子窗口一相同
unsigned long __stdcall Thread3(PVOID pvoid);
unsigned long __stdcall Thread4(PVOID pvoid);
LRESULT APIENTRY WndProc1(HWND hwnd,UINT iMsg,WPARAM wParam,LPARAM lParam)//子窗口1消息处理函数
{
static PARAMS params;
switch(iMsg)
{
case WM_CREATE:
params.hwnd=hwnd;
params.cyChar=HIWORD(GetDialogBaseUnits());
hThread[0]=CreateThread(NULL,0,Thread1,¶ms,0,NULL);//启动线程1
SetThreadPriority(hThread[0],THREAD_PRIORITY_BELOW_NORMAL);
return 0;
case WM_SIZE:
params.cyClient=HIWORD(lParam);
return 0;
case WM_DESTROY:
params.bKill=true;
return 0;
}
return DefWindowProc(hwnd,iMsg,wParam,lParam);
}

//自定义小函数检测字符有没有超过窗口高度
int CheckBottom(HWND hwnd,int cyClient,int cyChar,int iLine)
{
if(iLine*cyChar+cyChar>cyClient)
{
InvalidateRect(hwnd,NULL,TRUE);
UpdateWindow(hwnd);
iLine=0;
}
return iLine;
}

unsigned long __stdcall Thread1(PVOID pvoid)//子窗口一的线程函数,产生素数并输出
{
char szBuffer[16];
int iNum=1,iLine=0,i,iSqrt;
PPARAMS pparams;
pparams=PPARAMS(pvoid);
while(!pparams->bKill)
{
do{
if(++iNum<0)
iNum=0;
iSqrt=(int)sqrt(iNum);
for(i=2;i<=iSqrt;i++)
if(iNum%i==0)
break;
}while(i<=iSqrt);
iLine=CheckBottom(pparams->hwnd,pparams->cyChar,pparams->cyClient,iLine);
wsprintf(szBuffer,"%d",iNum);
HDC hdc=GetDC(pparams->hwnd);
TextOut(hdc,0,iLine*pparams->cyChar,szBuffer,strlen(szBuffer));
ReleaseDC(pparams->hwnd,hdc);
iLine++;
}
return 0;
}
...全文
147 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
jxw1987628 2007-10-11
  • 打赏
  • 举报
回复
楼上的 你好! 按你的我编译的时候去报如下错误的:

D:\Visual Studio 6.0\MSDev98\MyProjects\UIMutiThread\UIMutiThread.cpp(29) : error C2065: 'WndProc' : undeclared identifier
D:\Visual Studio 6.0\MSDev98\MyProjects\UIMutiThread\UIMutiThread.cpp(64) : error C2373: 'WndProc' : redefinition; different type modifiers
jxw1987628 2007-10-11
  • 打赏
  • 举报
回复
因篇幅有限 子窗口4对应的线程4与其他线程代码一样,所以没有帖,代码编译连接均正常,但有一个Warnong:WndProc not Initilize..............什么的.

还有就是如贴一所示的异常,只到今天还未找出错在哪里?谢谢楼上的帮我研究.因为我没有分了.....


真真喜欢研究程序的人,要不要分无所谓吧?至少楼上的做的很好!先说声谢谢了!===
jxw1987628 2007-10-11
  • 打赏
  • 举报
回复
// UIMutiThread.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
//LRESULT APIENTRY WndProc(HWND hwnd,UINT iMsg,WPARAM wParam,LPARAM lParam);//窗口消息函数声明
///////////////////////////////////////////////////////////////////////////
HANDLE hThread[4]; //全局线程句柄数组
///////////////////////////////////////////////////////////////////////////
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)

{




static char szAppName[]="MultiThread";
HWND hwnd;
MSG msg;
WNDCLASS wndclass;

WNDPROC WndProc;
wndclass.style=CS_HREDRAW|CS_VREDRAW;
wndclass.lpfnWndProc=(WNDPROC)WndProc;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hInstance=hInstance;
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);

wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszClassName=szAppName;
wndclass.lpszMenuName=NULL;

int a=RegisterClass(&wndclass);
//if(!a)
//cout<<"error here!\n"<<GetLastError()<<endl;


hwnd=CreateWindow(szAppName,"MultiPle UI Thread",WS_VISIBLE,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);



if(hwnd==NULL)
cout<<"error here!\n"<<GetLastError()<<endl;

ShowWindow(hwnd,nCmdShow);
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);


}
return msg.wParam;
}



LRESULT APIENTRY WndProc(HWND hwnd,UINT iMsg,WPARAM wParam,LPARAM lParam)//主线程窗口消息处理函数
{
typedef LRESULT APIENTRY WndProc(HWND,UINT,WPARAM,LPARAM);//函数原形声明

WndProc *WndProc1 = NULL,*WndProc2 = NULL,*WndProc3=NULL,*WndProc4=NULL;//函数指针
static char *szChildClass[]={"Child1","Child2","Child3","Child4"};//子窗口类名数组
static HWND hwndChild[4];//字窗口句柄数组
HINSTANCE hInstance;

static WndProc* ChildProc[]={WndProc1,WndProc2,WndProc3,WndProc4};//函数指针数组
int i,cxClient,cyClient;//存储窗口尺寸变量
WNDCLASSEX wndclass;
switch(iMsg)
{
case WM_CREATE :
hInstance=(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);
wndclass.cbSize=sizeof(wndclass);
wndclass.style=CS_HREDRAW|CS_VREDRAW;
wndclass.cbClsExtra=0;
wndclass.hInstance=hInstance;
wndclass.hIcon=NULL;
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.hIconSm=NULL;
wndclass.cbWndExtra=0;
wndclass.lpszMenuName=NULL;

for(i=0;i<4;i++)
{
wndclass.lpfnWndProc=ChildProc[i];
wndclass.lpszClassName=szChildClass[i];
RegisterClassEx(&wndclass);
hwndChild[i]=CreateWindow(szChildClass[i],NULL,WS_CHILDWINDOW|WS_BORDER|WS_VISIBLE,0,0,0,0,hwnd,(HMENU)i,hInstance,NULL);

}


return 0;

case WM_SIZE:
cxClient=LOWORD(lParam);
cyClient=HIWORD(wParam);
for( i=0;i<4;i++)
MoveWindow(hwndChild[i],(i%2)*cxClient/2,(i>1)*cyClient/2,cxClient/2,cyClient/2,TRUE);
return 0;

case WM_CHAR:
if(wParam=='q')
DestroyWindow(hwnd); //输入'q'时退出应用程序
return 0;
case WM_DESTROY:
PostQuitMessage(0);
for(int i=0;i<4;i++)
CloseHandle(hThread[i]);
return 0;
}
return DefWindowProc(hwnd,iMsg,wParam,lParam);
}


//自定义结构体传递参数
typedef struct
{
HWND hwnd;
int cxClient;
int cyClient;
int cyChar;
BOOL bKill;
}PARAMS,*PPARAMS;


//全局线程函数的声明
unsigned long __stdcall Thread1(PVOID pvoid);//子窗口一的线程函数,产生素数并输出
unsigned long __stdcall Thread2(PVOID pvoid);
unsigned long __stdcall Thread3(PVOID pvoid);
unsigned long __stdcall Thread4(PVOID pvoid);
LRESULT APIENTRY WndProc1(HWND hwnd,UINT iMsg,WPARAM wParam,LPARAM lParam)//子窗口1消息处理函数
{
static PARAMS params;
switch(iMsg)
{
case WM_CREATE:
params.hwnd=hwnd;
params.cyChar=HIWORD(GetDialogBaseUnits());
hThread[0]=CreateThread(NULL,0,Thread1,¶ms,0,NULL);//启动线程1
SetThreadPriority(hThread[0],THREAD_PRIORITY_BELOW_NORMAL);
return 0;
case WM_SIZE:
params.cyClient=HIWORD(lParam);
return 0;
case WM_DESTROY:
params.bKill=true;
return 0;
}
return DefWindowProc(hwnd,iMsg,wParam,lParam);
}
LRESULT APIENTRY WndProc2(HWND hwnd,UINT iMsg,WPARAM wParam,LPARAM lParam)//子窗口2消息处理函数
{
static PARAMS params;
switch(iMsg)
{
case WM_CREATE:
params.hwnd=hwnd;
params.cyChar=HIWORD(GetDialogBaseUnits());
hThread[1]=CreateThread(NULL,0,Thread2,¶ms,0,NULL);//启动线程2
SetThreadPriority(hThread[0],THREAD_PRIORITY_BELOW_NORMAL);
return 0;
case WM_SIZE:
params.cyClient=HIWORD(lParam);
return 0;
case WM_DESTROY:
params.bKill=true;
return 0;
}
return DefWindowProc(hwnd,iMsg,wParam,lParam);
}

LRESULT APIENTRY WndProc3(HWND hwnd,UINT iMsg,WPARAM wParam,LPARAM lParam)//子窗口3消息处理函数
{
static PARAMS params;
switch(iMsg)
{
case WM_CREATE:
params.hwnd=hwnd;
params.cyChar=HIWORD(GetDialogBaseUnits());
hThread[2]=CreateThread(NULL,0,Thread3,¶ms,0,NULL);//启动线程3
SetThreadPriority(hThread[0],THREAD_PRIORITY_BELOW_NORMAL);
return 0;
case WM_SIZE:
params.cyClient=HIWORD(lParam);
return 0;
case WM_DESTROY:
params.bKill=true;
return 0;
}
return DefWindowProc(hwnd,iMsg,wParam,lParam);
}
LRESULT APIENTRY WndProc4(HWND hwnd,UINT iMsg,WPARAM wParam,LPARAM lParam)//子窗口4消息处理函数
{
static PARAMS params;
switch(iMsg)
{
case WM_CREATE:
params.hwnd=hwnd;
params.cyChar=HIWORD(GetDialogBaseUnits());
hThread[3]=CreateThread(NULL,0,Thread4,¶ms,0,NULL);//启动线程4
SetThreadPriority(hThread[0],THREAD_PRIORITY_BELOW_NORMAL);
return 0;
case WM_SIZE:
params.cyClient=HIWORD(lParam);
return 0;
case WM_DESTROY:
params.bKill=true;
return 0;
}
return DefWindowProc(hwnd,iMsg,wParam,lParam);
}
//自定义小函数检测字符有没有超过窗口高度
int CheckBottom(HWND hwnd,int cyClient,int cyChar,int iLine)
{
if(iLine*cyChar+cyChar>cyClient)
{
InvalidateRect(hwnd,NULL,TRUE);
UpdateWindow(hwnd);
iLine=0;
}
return iLine;
}

unsigned long __stdcall Thread1(PVOID pvoid)//子窗口一的线程函数,产生素数并输出
{
char szBuffer[16];
int iNum=1,iLine=0,i,iSqrt;
PPARAMS pparams;
pparams=PPARAMS(pvoid);
while(!pparams->bKill)
{
do{
if(++iNum<0)
iNum=0;
iSqrt=(int)sqrt(iNum);
for(i=2;i<=iSqrt;i++)
if(iNum%i==0)
break;
}while(i<=iSqrt);
iLine=CheckBottom(pparams->hwnd,pparams->cyChar,pparams->cyClient,iLine);
wsprintf(szBuffer,"%d",iNum);
HDC hdc=GetDC(pparams->hwnd);
TextOut(hdc,0,iLine*pparams->cyChar,szBuffer,strlen(szBuffer));
ReleaseDC(pparams->hwnd,hdc);
iLine++;
}
return 0;
}
unsigned long __stdcall Thread2(PVOID pvoid)//子窗口一的线程函数,产生素数并输出
{
char szBuffer[16];
int iNum=1,iLine=0,i,iSqrt;
PPARAMS pparams;
pparams=PPARAMS(pvoid);
while(!pparams->bKill)
{
do{
if(++iNum<0)
iNum=0;
iSqrt=(int)sqrt(iNum);
for(i=2;i<=iSqrt;i++)
if(iNum%i==0)
break;
}while(i<=iSqrt);
iLine=CheckBottom(pparams->hwnd,pparams->cyChar,pparams->cyClient,iLine);
wsprintf(szBuffer,"%d",iNum);
HDC hdc=GetDC(pparams->hwnd);
TextOut(hdc,0,iLine*pparams->cyChar,szBuffer,strlen(szBuffer));
ReleaseDC(pparams->hwnd,hdc);
iLine++;
}
return 0;
}

chehw 2007-10-11
  • 打赏
  • 举报
回复
重贴一下代码,是不是你改错地方了

chehw 2007-10-10
  • 打赏
  • 举报
回复
在WinMain中注释掉 WNDPROC WndProc; //多余的声明
jxw1987628 2007-10-10
  • 打赏
  • 举报
回复
为什么没有人回复啊,郁闷!
代码转载自:https://pan.quark.cn/s/a4b39357ea24 LA 1010 逻辑分析仪被视作一种效能卓越的数字信号分析设备,其核心功能在于对数字通信协议,例如I²C,进行检测与解构。本资源将集中阐述LA 1010的操作流程以及如何借助该设备对I²C协议的波形展开分析。 确保逻辑分析仪被正确地连接至目标系统是极为关键的环节。在运用LA 1010的过程中,必须将分析仪的通道0与通道1分别对应连接至目标装置的SCL(时钟)与SDA(数据)线路。务必保证连接的稳固性且无任何干扰因素,以此确保数据采集的精确度。 随后,需要设定采样参数。采样频率对于能否成功捕捉到信号具有决定性的作用。针对I²C协议,通常选用的采样频率范围介于100kHz到400kHz之间,这一范围的选择取决于实际应用场景中I²C总线的运行速度。然而,LA 1010所能达到的最高采样速率可能高达500MHz,因此需要根据具体需求进行相应的调整。此外,还必须精心挑选适配目标设备工作电压的电压等级,例如3.3V、5V或1.8V。 在软件操作层面,需要选取恰当的通道与协议种类,即I²C。一旦启动采样,逻辑分析仪便开始记录相关数据。软件界面通常会实时展示波形图,为观察与分析提供便利。 关于I²C协议波形的解读,我们可以遵循以下步骤: 1. 总线处于空闲状态时:SCL与SDA均维持在高电平位置,这表明总线当前未进行数据传输。 2. 传输起始信号:当SCL处于高电平期间,SDA线从高电平转换至低电平,此动作标志着数据传输的开始。 3. 地址、数据及应答的识别:在每一个SCL高电平脉冲的持续时间内,SDA线上的电平状态代表了数据位。地址与数据的传输均为双向过程,而读写标识则由SDA线上的电平来...
内容概要:本文介绍了一种基于有限元分析(FEA)获取的磁通链接图来构建高精度永磁同步电机(PMSM)数学模型的方法,并在Simulink环境中实现仿真。该方法通过有限元软件提取电机在不同工况下的非线性磁通特性数据,建立精确的磁链-电流-转子位置映射关系,有效克服了传统线性模型在反映铁芯饱和、交叉耦合等非线性效应方面的局限性。所构建的模型能够更真实地模拟PMSM的实际电磁行为,适用于高性能控制算法(如矢量控制、直接转矩控制、模型预测控制等)的研发与验证,显著提升了控制系统在动态响应、效率优化和稳定性方面的仿真准确性。; 适合人群:具备电机控制理论基础、熟悉有限元分析与Simulink仿真的研究生、科研人员及从事电机设计与驱动系统开发的工程技术人员。; 使用场景及目标:①用于高精度永磁同步电机控制系统的设计、仿真与性能评估;②支持先进控制策略(如MPC、滑模控制、自适应控制)在非线性电机模型上的验证与优化;③为电机参数敏感性分析、能效优化、故障诊断与容错控制研究提供可靠的仿真平台; 阅读建议:建议读者结合ANSYS Maxwell、JMAG等有限元工具与Matlab/Simulink进行联合仿真,掌握从电磁场建模、数据提取、查表插值到控制系统集成的完整流程,并参考文中模型架构与数据处理方法,逐步复现、验证并拓展适用于特定电机结构的高保真仿真模型。

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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