如何打开form1的同时 ,让form2执行form2里的初始化

qiangshou2301 2009-06-30 09:33:33
请教大家一个问题:
就是打开form1的同时 ,让form2执行它的初始化,即:
执行form2里的Private Sub Form_Load()里的东西,此时form2窗口不显示,因为我单独在form1里做了个command1来form2.show ,这样form2打开后就不用再执行初始化了 。
我这样做的目的是先在form1里玩会游戏,这个时间来让form2初始化。
下面是form2初始化的内容:

Private Sub Form_Load()
Dim str1 As String
Dim arrOutput(1) As Byte
arrOutput(0) = &H1
arrOutput(1) = &H30
MSComm1.Output = arrOutput
DoEvents
Call Sleep(1000)
str1 = "DP140" & Chr(13)
Me.MSComm1.Output = str1
DoEvents
Call Sleep(1000)
str1 = "DI180" & Chr(13)
Me.MSComm1.Output = str1
DoEvents
Call Sleep(1000)
str1 = "DD120" & Chr(13)
Me.MSComm1.Output = str1
DoEvents
Call Sleep(1000)
str1 = "SV14564" & Chr(13)
Me.MSComm1.Output = str1
DoEvents
Call Sleep(1000)
str1 = "SA60000" & Chr(13)
Me.MSComm1.Output = str1
DoEvents
Call Sleep(1000)
str1 = "FE0" & Chr(13)
Me.MSComm1.Output = str1
DoEvents
Call Sleep(10000)
str1 = "MR436907" & Chr(13)
Me.MSComm1.Output = str1
DoEvents
Call Sleep(10000)
str1 = "DH" & Chr(13)
Me.MSComm1.Output = str1
End Sub
...全文
243 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
qiangshou2301 2009-07-02
  • 打赏
  • 举报
回复
非常感谢Chen8013与云哥 综合你2个的好了 能行 ok
谢谢了 每人50分 呵呵
zdingyun 2009-07-02
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 qiangshou2301 的回复:]
我的sleep是操作延时 不能去掉的 所以想先让用户在form1里玩游戏 背后让form2自己初始化
[/Quote]
Timer 控件也能起延迟操作的目的,且占用系统资源少.
qiangshou2301 2009-07-02
  • 打赏
  • 举报
回复
我的sleep是操作延时 不能去掉的 所以想先让用户在form1里玩游戏 背后让form2自己初始化
红叶哥 2009-07-02
  • 打赏
  • 举报
回复
Call Sleep(1000)
太多,太浪費時間了
我也支持LZ用Timer
zdingyun 2009-07-02
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 zdingyun 的回复:]
引用 17 楼 chen8013 的回复:
建议楼主还是用 Timer 控件来解决算了,发觉用 Sleep() 总会把整个进程‘卡死’的。

早就建议LZ:
Sleep()函数此种用法不妥,也给出了Timer 控件的方法,但LZ并不愿意使用Timer 控件.况且一个通信工程初始化的20多秒时间内玩游戏也只有LZ想得出来.
[/Quote]
http://topic.csdn.net/u/20090622/15/e3c377ad-4db7-4d7e-9b0d-d2772a1cf7d4.html
见上述链接的14楼处答复和使用Timer 控件的代码.
zdingyun 2009-07-02
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 chen8013 的回复:]
建议楼主还是用 Timer 控件来解决算了,发觉用 Sleep() 总会把整个进程‘卡死’的。
[/Quote]
早就建议LZ:
Sleep()函数此种用法不妥,也给出了Timer 控件的方法,但LZ并不愿意使用Timer 控件.况且一个通信工程初始化的20多秒时间内玩游戏也只有LZ想得出来.
舉杯邀明月 2009-07-02
  • 打赏
  • 举报
回复
建议楼主还是用 Timer 控件来解决算了,发觉用 Sleep() 总会把整个进程‘卡死’的。
'Form1 Code:
Option Explicit

Private Sub Command1_Click()

Unload Form2
End

End Sub

Private Sub Form_Load()

Me.Show
Load Form2
' Form2.Timer1.Interval = 10
' Form2.Timer1.Enabled = True

End Sub


'Form2 Code:
Option Explicit

'Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Dim iCount&

Private Sub Form_Load()

'你的其它执行代码
'Timer1.Interval = 10
Form2.Timer1.Interval = 1000
Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()

' Dim i&
' Timer1.Enabled = False
' For i = 1 To 10
' Form1.Label1.Caption = "正在进行第 " & i & " 步操作。"
' Sleep 1000 'Sleep 会‘卡死’整个VB进程
' 'DoEvents
' Next
' 上面的代码效果不行啊
'==========================================
'
'楼主这样来应用(不要用 Sleep):
iCount = iCount + 1
If (iCount > 20) Then
Timer1.Enabled = False
Exit Sub
End If
Select Case iCount
Case 1:
'操作1
Case 2:
'操作2
Case 3:
'操作3
Case 4:
'操作4
'...........
'...........
Case 20:
'操作20
End Select

End Sub

qiangshou2301 2009-07-01
  • 打赏
  • 举报
回复
找到了个其他语言做的多线程的例子:同时打开执行4个窗口

题目:创建一个包含4个窗口的多任务模拟:



第一窗口:显示递增偶数;



第二窗口:显示递增素数;



第三窗口:显示任意半径的圆;



第四窗口:显示随机矩形。



给出多线程解决方案,并调试通过。


步骤及源码:







一、 声明多线程;



DWORD WINAPI Thread1(LPVOID lpParam); HINSTANCE hInstance1;//声明多线程;



DWORD WINAPI Thread2(LPVOID lpParam); HINSTANCE hInstance2;



DWORD WINAPI Thread3(LPVOID lpParam); HINSTANCE hInstance3;



DWORD WINAPI Thread4(LPVOID lpParam); HINSTANCE hInstance4;



二、 声明窗体函数(但要先在资源视图中创建4个窗口DlgProc1~4);



BOOL __stdcall DlgProc1(HWND, UINT, WPARAM, LPARAM);//声明窗体函数;



BOOL __stdcall DlgProc2(HWND, UINT, WPARAM, LPARAM);



BOOL __stdcall DlgProc3(HWND, UINT, WPARAM, LPARAM);



BOOL __stdcall DlgProc4(HWND, UINT, WPARAM, LPARAM);



三、 主函数创建并调用4个线程:



int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)



{



DWORD dwThreadId[4];



HANDLE h[4];



// 创建四个线程







h[0] = ::CreateThread (



NULL, // 默认安全属性



NULL, // 默认堆栈大小



Thread1, // 线程入口地址(执行线程的函数)



NULL, // 传给函数的参数



0, // 指定线程立即运行



&dwThreadId[0]);// 返回线程的ID号







h[1] = ::CreateThread (



NULL, // 默认安全属性



NULL, // 默认堆栈大小



Thread2, // 线程入口地址(执行线程的函数)



NULL, // 传给函数的参数



0, // 指定线程立即运行



&dwThreadId[1]);// 返回线程的ID号







h[2] = ::CreateThread (



NULL, // 默认安全属性



NULL, // 默认堆栈大小



Thread3, // 线程入口地址(执行线程的函数)



NULL, // 传给函数的参数



0, // 指定线程立即运行



&dwThreadId[2]);// 返回线程的ID号







h[3] = ::CreateThread (



NULL, // 默认安全属性



NULL, // 默认堆栈大小



Thread4, // 线程入口地址(执行线程的函数)



NULL, // 传给函数的参数



0, // 指定线程立即运行



&dwThreadId[3]);// 返回线程的ID号







// 等待两个线程内核对象都变成受信状态



::WaitForMultipleObjects(



4, // DWORD nCount 要等待的内核对象的数量



h, // CONST HANDLE *lpHandles 句柄数组



TRUE, // BOOL bWaitAll 指定是否等待所有内核对象变成受信状态



INFINITE); // DWORD dwMilliseconds 要等待的时间







::CloseHandle(h[0]);



::CloseHandle(h[1]);



::CloseHandle(h[2]);



::CloseHandle(h[3]);



return 0;



}







四、 线程函数调用创建窗口的函数(线程函数的实现):



DWORD WINAPI Thread1(LPVOID lpParam)



{



::DialogBoxParam(



hInstance1, // 实例句柄



(LPCTSTR)IDD_DOUBLE, // 对话框资源ID号



NULL, // 父窗口句柄



DlgProc1, // 消息处理函数



NULL); // 对话框初始化的值,在WM_INITDIALOG消息的lParam参数中取出



return 0;



}







DWORD WINAPI Thread2(LPVOID lpParam)



{



::DialogBoxParam(



hInstance2, // 实例句柄



(LPCTSTR)IDD_PRIME, // 对话框资源ID号



NULL, // 父窗口句柄



DlgProc2, // 消息处理函数



NULL); // 对话框初始化的值,在WM_INITDIALOG消息的lParam参数中取出



return 0;



}







DWORD WINAPI Thread3(LPVOID lpParam)



{



::DialogBoxParam(



hInstance3, // 实例句柄



(LPCTSTR)IDD_CIRCLE, // 对话框资源ID号



NULL, // 父窗口句柄



DlgProc3, // 消息处理函数



NULL); // 对话框初始化的值,在WM_INITDIALOG消息的lParam参数中取出



return 0;



}







DWORD WINAPI Thread4(LPVOID lpParam)



{



::DialogBoxParam(



hInstance4, // 实例句柄



(LPCTSTR)IDD_RECTANGLE, // 对话框资源ID号



NULL, // 父窗口句柄



DlgProc4, // 消息处理函数



NULL); // 对话框初始化的值,在WM_INITDIALOG消息的lParam参数中取出



return 0;



}







五、 窗口函数显示窗体的内容(窗体客户端的实现):



BOOL __stdcall DlgProc1(HWND hDlg1, UINT message, WPARAM wParam, LPARAM lParam)



{







switch(message)



{







case WM_PAINT: // 窗口客户区需要重画



{



HDC hdc;
PAINTSTRUCT ps;
// 使无效的客户区变的有效,并取得设备环境句

hdc = ::BeginPaint (hDlg1, &ps) ;
char szText[56];
int i,a;
a=0;
for(i=0;i<30;i++)
{ a=a+2;
::Sleep(1000);
wsprintf(szText,"输出偶数:%d",a);
::TextOut(hdc, 10, 10, szText, strlen(szText));
}
::EndPaint(hDlg1, &ps);
return 0;
}
case WM_INITDIALOG: // 初始化对话框
::SetWindowText(hDlg1,"偶数");
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK:
::EndDialog(hDlg1, IDOK);
break;
}
break;
}
return 0;
}
qiangshou2301 2009-07-01
  • 打赏
  • 举报
回复
谁能提供这样的代码 将不甚感激 最好是VC做成dll调用的
qiangshou2301 2009-07-01
  • 打赏
  • 举报
回复
可是我至少要sleep个20s,这20秒不能让用户白等着啊 所以给他们搞了小游戏先玩玩。界面友好嘛
哪位仁兄会多线程,能否就我同时打开2个form,但是form2得隐藏(不用hide)不显示写个多线程的代码啊!最好是用VC做个dll,VB调用实现执行多任务。
jhone99 2009-07-01
  • 打赏
  • 举报
回复
你加载的代码并不大,把sleep去掉就可以了。
qiangshou2301 2009-07-01
  • 打赏
  • 举报
回复
哪位仁兄会多线程,能否就我同时打开2个form,但是form2得隐藏(不用hide)不显示写个多线程的代码啊!最好是用VC做个dll,VB调用实现执行多任务。
qiangshou2301 2009-07-01
  • 打赏
  • 举报
回复
回yun:
Private Sub Form_Load()
Show
Load Form2
End Sub
这样的话只会显示form1,但是不能对form1执行任何操作,还得等form2初始化完成才能操作form1.我觉得还是多线程,就是让VB同时执行2个窗口的任务。但是多线程来做VB听说会很崩溃的。有的给我建议最好用VC做好dll后VB调用。可是还不会做这个!多线程也只是听说过!
SYSSZ 2009-07-01
  • 打赏
  • 举报
回复
要用多线程来实现
zdingyun 2009-07-01
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jiangfx2001 的回复:]
想了一下,应该是要用多线程来实现吧!
你说的那种情况就是一边在FORM1里玩游戏,一边FORM2要完成它的初始化,两个事件要同时发生。
不用多线程,应该是没办法实现的!
[/Quote]
使用Timer控件的目的本身可把任务转入后台执行.
见MSDN:
使用 Timer 控件
Timer 控件响应时间的流逝。它们独立于用户,编程后可用来在一定的时间间隔执行操作。此控件的一个一般用处是检查系统时钟,判断是否该执行某项任务。对于其它后台处理, Timer 控件也非常有用。

要先显示Form1只需在Form1的Form_Load事件中加Show:
Private Sub Form_Load()
Show
Load Form2
End Sub


qiangshou2301 2009-07-01
  • 打赏
  • 举报
回复
回LS:我form2里初始化里牵扯到运动 有20多秒的时间 所以必须要sleep下。
jiangfx2001 2009-07-01
  • 打赏
  • 举报
回复
想了一下,应该是要用多线程来实现吧!
你说的那种情况就是一边在FORM1里玩游戏,一边FORM2要完成它的初始化,两个事件要同时发生。
不用多线程,应该是没办法实现的!
elmnd 2009-07-01
  • 打赏
  • 举报
回复
咦?数据库操作那样?行不行?
zhang300521 2009-07-01
  • 打赏
  • 举报
回复
Load Form2 最直接的办法就是把这个放在 Form1 里面的那个方法下啦· 等你触发那时间的时候就可以喏
也可以 自己建个事件 在Form1上做出提示不是更好吗 ?

zdingyun 2009-07-01
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 qiangshou2301 的回复:]
回yun:
Private Sub Form_Load()
    Show
    Load Form2
End Sub
这样的话只会显示form1,但是不能对form1执行任何操作,还得等form2初始化完成才能操作form1.我觉得还是多线程,就是让VB同时执行2个窗口的任务。但是多线程来做VB听说会很崩溃的。有的给我建议最好用VC做好dll后VB调用。可是还不会做这个!多线程也只是听说过!
[/Quote]
看来LZ对Timer控件的应用是完全不了解.我做的通信工程使用了多个Timer控件,它起的作用是可以后台执行设置的任务,并不妨碍程序的其它界面在空闲时间执行操作.
每1000毫秒执行一次发送不到10字节的串口指令,仅用去11毫秒,剩余的989毫秒系统完全可做其它事.仅是在11毫秒内系统完全处于处理串口发送.
加载更多回复(3)

863

社区成员

发帖
与我相关
我的任务
社区描述
VB COM/DCOM/COM+
c++ 技术论坛(原bbs)
社区管理员
  • COM/DCOM/COM+社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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