1. Tải bản cài đặt AutoIT mới nhất

    Chào Khách. Nếu bạn mới tham gia và chưa cài đặt AutoIT.
    Vui lòng vào topic trên để tải bản AutoIT mới nhất nhé
    Dismiss Notice
  2. Quy định và nội quy

    Chào Khách. Vui lòng đọc kỹ nội quy và quy định của diễn đàn
    Để tránh bị ban một cách đáng tiếc nhé!
    Dismiss Notice
  3. Hướng dẫn chèn mã AutoIT trong diễn đàn

    Chào Khách. Vui lòng xem qua bài viết này
    Để biết cách chèn mã AutoIT trong diễn đàn bạn nhé :)
    Dismiss Notice

Hỏi đáp [Solved] Vấn đề về Start/Stop Button trong GUI

Thảo luận trong 'Thảo luận chung - Hỏi đáp' bắt đầu bởi Phund, 12/10/17.

Trạng thái chủ đề:
Không mở trả lời sau này.
  1. Phund

    Phund Thành viên mới
    • 3/6

    Tham gia ngày:
    19/9/17
    Bài viết:
    12
    Đã được thích:
    4
    Dear anh em,
    tôi đang làm cái GUI nút start/pause như sau:
    • nút start khởi động module chính và có sleep
    • nút pause tạm dừng cả tool chờ
    • trong quá trình pause, việc sleep vẫn lắng nghe msg bằng GUIGetMsg()
    mình gặp vấn đề là click lúc được lúc phải vài click tool mới nhận và nghĩ không ra được nguyên nhân, các bạn giúp mình nhé

    Mã (AutoIt):
    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=
        $Form1 = GUICreate("", 355, 211, 935, 350)
        $Group1 = GUICtrlCreateGroup("", 8, 48, 249, 97)
        $BtnStart = GUICtrlCreateButton("Start", 16, 64, 65, 33)
        $LblFooter = GUICtrlCreateLabel("Thông tin chung", 8, 192, 337, 17)
        GUICtrlCreateGroup("", -99, -99, 1, 1)
        GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    Global $paused = False
    Global $i = 0

    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                Exit
            Case $BtnStart
                BtnStart_Click()
        EndSwitch
    WEnd


    Func BtnStart_Click()
        GUICtrlSetData($BtnStart, "Pause")
        $paused = False
        While 1
            $i += 1
            ToolTip('Đang hoạt động, biến tăng: ' & $i)
            iSleep(500)
        WEnd
    EndFunc


    Func BtnPause_Click()
        GUICtrlSetData($BtnStart, "Resume")
        $paused = True
        While 1
            ToolTip('Đang tạm dừng')
            iSleep(100)
        WEnd
    EndFunc

    Func iSleep($iDelay)
        $iBegin = TimerInit()
        While TimerDiff($iBegin) < $iDelay
            If GUIGetMsg() = $GUI_EVENT_CLOSE Then
                Exit
            EndIf
            If GUIGetMsg() = $BtnStart and $paused Then
                BtnStart_Click()
            EndIf
            If GUIGetMsg() = $BtnStart and Not $paused Then
                BtnPause_Click()
            EndIf
        WEnd
    EndFunc
     
  2. Phund

    Phund Thành viên mới
    • 3/6

    Tham gia ngày:
    19/9/17
    Bài viết:
    12
    Đã được thích:
    4
    omg, 1 ngày mà ko có một rep nào, các bạn ơi cho xin ý kiến với ;)
     
  3. Huân Hoàng

    Huân Hoàng Administrator Thành viên BQT Administrator Super Moderator
    • 93/113

    Tham gia ngày:
    29/9/15
    Bài viết:
    642
    Đã được thích:
    1,181
    Do trong hàm iSleep thým gọi nhiều GUIGetMsg() quá, mà AutoIt nó khá kém trong việc xử lý nhiều luồng thông tin → Vì vậy AutoIt nó "đau não" không biết xử lý Message nhận được nào trước nào sau, dẫn đến đơ :v

    Căn bản thì chỉ cần chỉnh nhẹ lại iSleep (chỉ gọi 1 cái GUIGetMsg) là code chạy mượt mà ngay ấy mà:

    Mã (AutoIt):
    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=
        $Form1 = GUICreate("", 355, 211)
        $Group1 = GUICtrlCreateGroup("", 8, 48, 249, 97)
        $BtnStart = GUICtrlCreateButton("Start", 16, 64, 65, 33)
        $LblFooter = GUICtrlCreateLabel("Thông tin chung", 8, 192, 337, 17)
        GUICtrlCreateGroup("", -99, -99, 1, 1)
        GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    Global $paused = False
    Global $i = 0

    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                Exit
            Case $BtnStart
                BtnStart_Click()
        EndSwitch
    WEnd


    Func BtnStart_Click()
        GUICtrlSetData($BtnStart, "Pause")
        $paused = False
        While 1
            $i += 1
            ToolTip('Đang hoạt động, biến tăng: ' & $i)
            iSleep(500)
        WEnd
    EndFunc


    Func BtnPause_Click()
        GUICtrlSetData($BtnStart, "Resume")
        $paused = True
        ToolTip('Đang tạm dừng')
        While 1
            iSleep(100)
        WEnd
        ToolTip('')
    EndFunc


    Func iSleep($iDelay)
        $iBegin = TimerInit()
        While TimerDiff($iBegin) < $iDelay
            Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE
                    Exit
                Case $BtnStart
                    If $paused Then
                        BtnStart_Click()
                    Else
                        BtnPause_Click()
                    EndIf
            EndSwitch
        WEnd
    EndFunc
    P/S: Code thým sửa lại ngon voãi chày, không ngờ có thể sử dụng kiểu:
    $iBegin = TimerInit()
    While TimerDiff($iBegin) < $iDelay​

    Start/Stop mượt kinh :v Code này đem đi làm code mẫu cho mọi người tìm hiểu là chuẩn bài rồi (y)
     
  4. Phund

    Phund Thành viên mới
    • 3/6

    Tham gia ngày:
    19/9/17
    Bài viết:
    12
    Đã được thích:
    4
    OMG,
    chỉ có thể há mồm, đúng là súp mót có khác, chỉ chỏ cái là gỡ ngay đoạn khó, thank nhiều nhiều nhé
     
Trạng thái chủ đề:
Không mở trả lời sau này.

Chia sẻ trang này

Đang tải...