用多进程做浏览器为什么也会卡

ndsc213456789 2014-01-08 11:39:53
用IE内核做浏览器会很卡,且一个页面崩溃会累及其它页面。所以想用多进程的方式来做,我想到的方法是:用一个MDIform窗体做浏览器框架,查找到它的MDIClient子窗口,每新建一个链接就启动新进程,新进程中包容WebBrowser的窗口负责打开链接,再把这个窗口的父窗口设为那个MDIClient窗口(通过SetParent函数设置),这样就可以在浏览器程序中看到新开的页面,但实际这个页面是另外一个进程的。
现在的问题是:如果这个页面卡住的话,主程序窗口一样会被卡住。它们本来是两个进程的窗口,怎么还会互相影响呢?
...全文
491 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
hpygzhx520 2014-04-24
  • 打赏
  • 举报
回复
我看了世界之窗3.6,绝对不是父子关系。 假死,脚本内存泄露这些,据说只存在于IE内核。
ndsc213456789 2014-04-24
  • 打赏
  • 举报
回复
引用 14 楼 hpygzhx520 的回复:
只要是父子窗体关系,就必然会这样。很多消息是通过父窗体来传递的。子窗体假死的时候,会锁住主窗体的。 你看下主流的多进程浏览器,都是平行窗口的。但是多进程浏览器也有很多难点,我也对这个感兴趣,可以一起讨论。
应当不是平行的吧,遨游,360都看过,网页窗口和外框架窗口确实是父子关系,如果网页使用Chrome内核浏览时,网页和主框架同属一个进程,如果使用ie内核时,则网页和主框架则分属不同进程。
taoguangye 2014-04-24
  • 打赏
  • 举报
回复
setparent 必定是这个样子的,主子窗口中之间是有联系的,一个卡了必定要连累另一个的
hpygzhx520 2014-04-23
  • 打赏
  • 举报
回复
只要是父子窗体关系,就必然会这样。很多消息是通过父窗体来传递的。子窗体假死的时候,会锁住主窗体的。 你看下主流的多进程浏览器,都是平行窗口的。但是多进程浏览器也有很多难点,我也对这个感兴趣,可以一起讨论。
一如既往哈 2014-04-22
  • 打赏
  • 举报
回复
我知道楼主所说的,因为我也遇到过。 2个进程:proc1和proc2,proc1启动后再用shell启动proc2(带参数),proc2启动时将自己的主窗体用setparent设置到proc1中,这时如果proc2进入一个死循环,那么proc1也会类似,不会有任何反应....
ndsc213456789 2014-01-13
  • 打赏
  • 举报
回复
引用 10 楼 xiaoyao961 的回复:
最好的做法是每个新页面用线程来操作:代码来生成新窗口,然后在窗口中加载WEBBROWSER控件,这样每个WEBBROWSER的父窗口或容器都是由该线程生成的,理论上来说应该和主线程没有任何关系,肯定卡不到主线程,崩溃是没办法。
我想这可能并不是多线程的问题,因为子页面线程和主程序线程都已经分属两个不同的进程中了。它们之间仅仅是主窗口和子窗口的关系。很有可能是既然子页面成了子窗口,人家主窗口就要对子窗口负责,经常性的sendmessage一些信息给子窗口,而子窗口正卡着呢,没有时间处理这些信息,于是主窗口sendmessage函数得不到返回,连带着也就卡住了。比如最简单的,如果用sendmessage发wm_gettext消息去取得另外一个进程窗口标题,如果那个进程窗口刚好卡住,那么发sendmessage函数的程序也得卡住,只是这种情况一般在主程序主动发sendmessage函数给子窗口才会发生,而我的程序都没有这种情况,为什么也会卡住?
  • 打赏
  • 举报
回复
最好不要用VB6做,用VB.NET2012之类吧,想要多线程,速度快,用VB6总是不胜任
  • 打赏
  • 举报
回复
最好的做法是每个新页面用线程来操作:代码来生成新窗口,然后在窗口中加载WEBBROWSER控件,这样每个WEBBROWSER的父窗口或容器都是由该线程生成的,理论上来说应该和主线程没有任何关系,肯定卡不到主线程,崩溃是没办法。
  • 打赏
  • 举报
回复
我知道是网页中操作某步时卡,SETPARENT本身并不会卡,我是说如果在不同的线程中进行SETPARENT,不知会不会好一点,同线程的东西,肯定是一个卡就全卡了
ndsc213456789 2014-01-08
  • 打赏
  • 举报
回复
把下面的程序保存为form1.frm文件,再打开编译运行就知道我说的是什么了。
VERSION 5.00
Begin VB.Form Form1 
   Caption         =   "Form1"
   ClientHeight    =   4260
   ClientLeft      =   60
   ClientTop       =   450
   ClientWidth     =   6600
   LinkTopic       =   "Form1"
   ScaleHeight     =   4260
   ScaleWidth      =   6600
   StartUpPosition =   3  '窗口缺省
   Begin VB.PictureBox Picture1 
      Height          =   3615
      Left            =   0
      ScaleHeight     =   3555
      ScaleWidth      =   6315
      TabIndex        =   2
      Top             =   600
      Width           =   6375
   End
   Begin VB.TextBox Text1 
      Height          =   495
      Left            =   240
      TabIndex        =   1
      Text            =   "Text1"
      Top             =   0
      Width           =   3135
   End
   Begin VB.CommandButton Command1 
      Caption         =   "挂起30秒,模拟打开网页时卡住"
      Height          =   375
      Left            =   3480
      TabIndex        =   0
      Top             =   120
      Width           =   3015
   End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Private Sub Command1_Click()
  Text1.Text = "看看主程序中的文本框能否输入文字"
  DoEvents
  Sleep 1000 * 30
End Sub

Private Sub Form_Load()
Dim apath As String
apath = App.Path
If Right(apath, 1) <> "\" Then apath = apath & "\"
If Len(Command$) = 0 Then
  Me.Show
  Command1.Visible = False
  Shell apath & App.EXEName & ".exe " & Picture1.hWnd
Else
  SetParent Me.hWnd, Val(Command$)
  Me.Caption = "这是另一进程的窗口"
  Me.Show
  Me.WindowState = 2
End If
End Sub
赵4老师 2014-01-08
  • 打赏
  • 举报
回复
还有时候卡,是因为其它线程或进程中的某个循环中少写Sleep或该调用阻塞函数结果没阻塞导致CPU负荷100%
赵4老师 2014-01-08
  • 打赏
  • 举报
回复
界面卡,其实有时候是该调用消息循环的时候没调用而已。
MSG msg;
if (GetMessage(&msg,NULL,0,0)) {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}
taoguangye 2014-01-08
  • 打赏
  • 举报
回复
这种情况中能用多线程解决,不同的窗口用不同的线程
ndsc213456789 2014-01-08
  • 打赏
  • 举报
回复
引用 1 楼 xiaoyao961 的回复:
你试下用多线程的方式设置SETPARENT,这样的话,进程也不同,线程也不同,应该好一点吧,就是创建一个线程,在线程中之实现SETPARNET
并不是在SETPARENT过程中卡的,而是当子页面中卡的时候,主程序页面的东西也卡住了
ndsc213456789 2014-01-08
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
卡是因为TCP/IP socket recv或send,跟是否多进程基本无关。
可能我没有说清楚,这里的卡是这样的:当子页面挂起时--我特意在子页面中试过sleep 30秒钟,这时主程序中的所有操作都没有反应,在这30秒内,按钮不能点,文本框也不能输入,也就是主程序也挂起了。
赵4老师 2014-01-08
  • 打赏
  • 举报
回复
卡是因为TCP/IP socket recv或send,跟是否多进程基本无关。
  • 打赏
  • 举报
回复
你试下用多线程的方式设置SETPARENT,这样的话,进程也不同,线程也不同,应该好一点吧,就是创建一个线程,在线程中之实现SETPARNET

1,451

社区成员

发帖
与我相关
我的任务
社区描述
VB 控件
社区管理员
  • 控件
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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