none
當開啟網頁程式時,程式執行緒內的工作被拖慢[VS2019] RRS feed

  • 一般討論

  • 各位好,我的程式是開發來進行自動化控制的,最近遇到一個問題,程式正常運行時,當開啟網頁瀏覽器(Google Chrome or Microsoft Edge),程式明顯就開始變慢,動作間隔也被拉長,ThreadPriority已經設定在Highest,不太確定這個是甚麼因素造成的,之前的都沒有這個現象,只知道更換了新的電腦,相關硬體規格都有提升了,同樣都是Win10 LTSC,也試過把顯卡獨立出來用,也有搜尋了相關網頁造成CPU100%的原因,但都無法排除這個現象,是否有前輩有這方面的經驗可以分享給小弟.謝謝.
    2021年2月26日 上午 12:40

所有回覆

  • 如果網頁是部署在Web伺服器(例如IIS), 可以不需要程式使用執行緒來啟動, 因為Web伺服器會自動指派執行緒
    2021年2月26日 上午 01:41
  • 你好,我想了解多一點你的問題。

    你有一台Win10,還有你有個用VB.NET開發的程式,它是一直運行在Win10中的。然後你打開任何的網頁瀏覽器,程式就會給拖慢。

    你的程式是做什麼的?是否listen 什麼port去等呼叫和執行?而網頁瀏覽器執行後,CPU會上升到100%?有沒有在其他同樣硬件和Win10的電腦,試試會不會有同樣情況?


    大家一齊探討、學習和研究,謝謝!
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD,
    MCT, Microsoft Community Star(TW & HK),
    Microsoft MVP for .NET (2003-2017)
    Microsoft rMVP
    My MSMVP Blog
    請記得將對您有幫助的回覆 標示為解答 以幫助其他尋找解答及參與社群討論的朋友們。
    Please remember to click Mark as Answer on the post that helps you. This can be beneficial to other community members reading the thread.


    2021年3月1日 上午 04:49
  • 你好,謝謝你的回覆,

    基本上自動化設備的程式相對單純很多,大致上都是呼叫其他元件提供的API來進行一些控制,例如控制一個馬達進行A.B兩點之間的反覆移動(移動到A點-->到達位置判斷-->移動到B點-->到達位置判斷),當瀏覽器不開啟時,可以看到60k UPH,但瀏覽器一開啟就只剩下不到30k UPH,有試過在同樣硬體規格的其他台電腦中去跑程式也是相同會有被拖慢的結果,另外也有發現到一個問題,IDE環境中直接編譯後開始跑的程式,就不會有這個現象,若透過release出來的執行檔來跑,就會被瀏覽器給影響到.

    對於這個部分實在不太能理解為何會有這種現象......

    2021年3月3日 上午 03:28
  • 首先请您先说明您开发的是什么程式?是WinForm VB.NET吗?通过Serial Port来控制?只被浏览器影响吗?您的电脑是什么配置?有几个CPU核心?您开浏览器进行的是什么操作?上网查看网页?通过浏览器运行什么程式?操作系统有被系统管理员设置过什么吗?有没有试过“以管理员身份运行”?您的描述实在太笼统,需要提供更多的细节别人才好分析问题。

    另外还有一点,您这个程式一秒钟要采集多少次数据,进行多少运算呢?这个UPH和您的程式之间是什么关系?是程式的运算被拖慢了还是Serial Port收发受到了影响?

    • 已編輯 [-] 2021年3月3日 下午 01:05
    2021年3月3日 下午 12:52
  • 不好意思,我應該要好好描述自己的問題的,以下是我的程式碼,IPC透過網路端口對其他從站裝置進行EtherCAT連接,主機板 Super Micro MBD-C9Z390-CG, CPU i9-9900k, 256G SSD, 16G RAM, Win10 LSTC. Hyper thread = disable, CPU core有劃分給RTSS即時系統使用,因此7個核心用在windows kernal, 1個在RTSS. 目前很明顯就是在sleep()出現延遲的現象,因為有測試將sleep() bypass,再來從站裝置來監控內部數據,正反轉的命令就是連接再一起的. 奇怪的是之前這個程式碼在其他台電腦CPU i7-9700下跑,其他規格相同,這個現象就不明顯,只有剛開啟網頁瀏覽器有延遲了一下,之後就恢復正常. 目前的卻是斷斷續續延遲到sleep(),一直要到網頁瀏覽器被關閉才正常,網頁瀏覽器就是開啟了Google的首頁而已. UPH純粹就是馬達動作的頻率,必須要有60k的頻率,所以馬達的速度,加減速都設定的很高.

     Private Sub Button47_Click(sender As Object, e As EventArgs) Handles Button47.Click
            Dim thread As New System.Threading.Thread(AddressOf Start_MutiThread_Run_5)

            thread.Priority = ThreadPriority.Highest
            thread.Start()
        End Sub

        Private Sub Start_MutiThread_Run_5()
            Dim pos, pos1 As New Motion.PosCommand
            Dim waitcondition As New Motion.WaitCondition
            Dim EVT As New EventControl.Event
            Dim ret As Integer
            Dim retStr As String


            EVT.Enabled = 1
            EVT.InputFunction = EventControl.EventInputFunction.OpState
            EVT.Input_OpState.OpState = OperationState.Idle
            EVT.Input_OpState.Axis = 0
            EVT.Input_OpState.Invert = 0
            EVT.OutputFunction = EventControl.EventOutputFunction.None

            ret = wmxlib3.SetEvent(0, EVT)
            If ret <> ErrorCode.None Then
                retStr = EventControl.ErrorToString(ret)
                MsgBox("Error SetEvent()" & vbCrLf & "ErrorCode [0x" & Hex(ret) & "]" & vbCrLf & retStr)
                Exit Sub
            End If

            ret = wmxlib3.EnableEvent(0, 1)
            If ret <> ErrorCode.None Then
                retStr = EventControl.ErrorToString(ret)
                MsgBox("Error EnableEvent()" & vbCrLf & "ErrorCode [0x" & Hex(ret) & "]" & vbCrLf & retStr)
                Exit Sub
            End If

            pos.Axis = 0
            pos.Target = 10000
            pos.Profile.Velocity = 1000000
            pos.Profile.StartingVelocity = 0
            pos.Profile.EndVelocity = 0
            pos.Profile.Acc = 100000000
            pos.Profile.Dec = 100000000

            pos1.Axis = 0
            pos1.Target = 0
            pos1.Profile.Velocity = 1000000
            pos1.Profile.StartingVelocity = 0
            pos1.Profile.EndVelocity = 0
            pos1.Profile.Acc = 100000000
            pos1.Profile.Dec = 100000000

            waitcondition.WaitConditionType = Motion.WaitConditionType.Event
            waitcondition.EventID = 0


            For i As Integer = 1 To 99999
                ret = wmxlib2.Motion.StartPos(pos)
                If ret <> ErrorCode.None Then
                    retStr = CoreMotion.ErrorToString(ret)
                    MsgBox("Error StartPos()" & vbCrLf & "ErrorCode [0x" & Hex(ret) & "]" & vbCrLf & retStr)
                    Exit Sub
                End If

                ret = wmxlib2.Motion.Wait(waitcondition)
                If ret <> ErrorCode.None Then
                    retStr = CoreMotion.ErrorToString(ret)
                    MsgBox("Error Wait()" & vbCrLf & "ErrorCode [0x" & Hex(ret) & "]" & vbCrLf & retStr)
                    Exit Sub
                End If

                Threading.Thread.Sleep(10)

                ret = wmxlib2.Motion.StartPos(pos1)
                If ret <> ErrorCode.None Then
                    retStr = CoreMotion.ErrorToString(ret)
                    MsgBox("Error StartPos()" & vbCrLf & "ErrorCode [0x" & Hex(ret) & "]" & vbCrLf & retStr)
                    Exit Sub
                End If

                ret = wmxlib2.Motion.Wait(waitcondition)
                If ret <> ErrorCode.None Then
                    retStr = CoreMotion.ErrorToString(ret)
                    MsgBox("Error Wait()" & vbCrLf & "ErrorCode [0x" & Hex(ret) & "]" & vbCrLf & retStr)
                    Exit Sub
                End If

                Threading.Thread.Sleep(10)
            Next

    End Sub

    2021年3月4日 上午 09:18
  • 您先用Windows Task Manager看一下CPU、网卡等设备的运行状况,如果浏览器占用了CPU或者影响了网络用Windows Task Manager可以很容易发现问题。另外,您这里用这个Sleep的目的是什么呢?Sleep通常不用在工控项目中,因为第一Sleep本身就不是一个稳定的指令,并不能精确进行等待,此外使用了Sleep后虽然Thread被暂停了,但工控设备可能仍然在收发数据,这样会导致数据丢失或堵塞。您的这个wmxlib、Motion、EventControl应该都是设备供应商提供的第三方API吧,这些API不能连续工作吗?为何要用Sleep暂停呢?

    此外,您可以在窗口中加入一个TextBox,然后在代码中加入几个GetTickCount(低精度)或QueryPerformanceFrequency和QueryPerformanceCounter(高精度)来对每一部分代码的运行耗时进行统计,然后将计时结果写到TextBox中,在For循环中每一次循环刷新一次统计结果,看看哪一部分的代码出现了问题。例如下面的伪代码这样:

    For
    //记录时间点1
    wmxlib2.Motion.StartPos(pos)
    //记录时间点2
    wmxlib2.Motion.Wait(waitcondition)
    //记录时间点3
    Threading.Thread.Sleep(10)
    //记录时间点4
    wmxlib2.Motion.StartPos(pos1)
    //记录时间点5
    wmxlib2.Motion.Wait(waitcondition)
    //记录时间点6
    Threading.Thread.Sleep(10)
    //记录时间点7
    //TextBox.Text = 计算耗时1(时间点2-时间点1)+计算耗时2(时间点3-时间点2)+...+计算耗时6(时间点7-时间点6)
    Next
    • 已編輯 [-] 2021年3月4日 上午 11:58
    2021年3月4日 上午 11:55
  • 你好,確實sleep()只是在這個範例中使用的,實際應用是在這個地方再進到視覺處理的函式,取得視覺演算的數據後,才會再將下一個馬達移動點丟到後面的移動指令,但實際程式就是會有這個延遲問題,爲了排查問題才會用sleep()來取代,實際上視覺處理的時間我驗證過大約就是14~16ms。
    2021年3月5日 上午 11:08
  • 那您的程式中是视觉处理部分受到了影响,还是马达控制部分受到了影响呢?我建议您还是建一个 TextBox,然后对每一行指令分别进行统计,开启和不开启浏览器进行对比,看看到底哪一部分受到了影响,还是全部都受到了影响。

    另外,您有没有尝试不要手动设定 Hyper thread 和 CPU core,仅以默认方式执行。还有,在您排查代码之前请先用 Windows Task Manager 看一下 CPU 和网络部分是否有异常现象。按理说我认为问题应该是在 EtherCAT 方面,也就是马达控制方面,但您说去掉 Sleep 后就没问题了,这有点奇怪,因此建议您先用 Windows 自带的 Task Manager 看一下,然后对代码的不同指令分别统计运行时间,找出究竟是哪个地方出了问题。

    因为您这个问题涉及特定硬件和第三方 API,所以其他人是无法重现您的问题的,您不得不自行排查每一个细节。

    • 已編輯 [-] 2021年3月5日 下午 03:13
    2021年3月5日 下午 02:12