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] Làm sao để 2 vòng lặp trong GUI không gây "đơ" lẫn nhau

Thảo luận trong 'Thảo luận chung - Hỏi đáp' bắt đầu bởi LVT491, 21/8/18.

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

    LVT491 Thành viên
    • 18/23

    Tham gia ngày:
    22/12/16
    Bài viết:
    46
    Đã được thích:
    26
    Chào các bác
    Tình hình là iêm có viết cái tool để kiểm tra ping của 1 danh sách nhiều địa chỉ IP. Ở GUI main thì có 1 cái vòng lặp while rồi. Có 1 Func _checkping(), trong func này có 1 vòng lặp while để ping lặp đi lặp lại danh sách các IP đã nhập (và xuất ra list IP ping NG). Khi func này được gọi thì không thể gọi được func khác nữa, kể cả việc exit GUI. Các bác chỉ giáo phát ạ. Xin cảm ơn!
     
  2. thedemonstuan1

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

    Tham gia ngày:
    22/2/18
    Bài viết:
    8
    Đã được thích:
    1
    xài udf coproc đi man à :))
     
    LVT491 thích bài này.
  3. LVT491

    LVT491 Thành viên
    • 18/23

    Tham gia ngày:
    22/12/16
    Bài viết:
    46
    Đã được thích:
    26
    Bác hướng dẫn e phát, e thử nó toàn báo lỗi gì gì ấy
     
  4. LVT491

    LVT491 Thành viên
    • 18/23

    Tham gia ngày:
    22/12/16
    Bài viết:
    46
    Đã được thích:
    26
    Đây là code, e sửa cái func _checkping() thành newthread()

    Mã (AutoIt):
    #NoTrayIcon
    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Icon=..\Aut2Exe\Icons\AutoIt_Main_v10_48x48_RGB-A.ico
    #AutoIt3Wrapper_UseUpx=y
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #include <Misc.au3>
    #include <GuiListView.au3>

    HotKeySet('!x', '_exit')
    Opt("GUIOnEventMode", 1)
    Opt('MustDeclareVars', 1)
    Global $arr[11] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, "."]
    Global $path = @TempDir & '\ip_list.txt'
    Global $sortSense = False, $total, $ngno

    Global $gui1 = GUICreate(@ComputerName, 550, 510, -1, -1, 0x00800000)
    GUISetFont(10)
    Global $menu = GUICtrlCreateMenu('Menu')
    Global $mnitem1 = GUICtrlCreateMenuItem('Quit (Alt+X)', $menu)
    Global $input1 = GUICtrlCreateInput('', 5, 5, 160, 400, BitOR(4, 64, 0x00200000))
    GUICtrlSendMsg($input1, 0xC5, -1, 0) ; remove limit text
    Global $listview1 = GUICtrlCreateListView('List Camera IP', 220, 5, 150, 400, BitOR(8, 4, 32768))
    GUICtrlSendMsg($listview1, 4150, 1, 1)
    Global $ctmenu = GUICtrlCreateContextMenu($listview1)
    Global $ctitem1 = GUICtrlCreateMenuItem('Delete IP', $ctmenu)
    Global $listview2 = GUICtrlCreateListView('NG Camera IP', 410, 5, 130, 400, BitOR(8, 4, 32768))
    GUICtrlSendMsg($listview2, 4150, 1, 1)
    GUICtrlSetColor($listview2, 0xFF0000)
    Global $label1 = GUICtrlCreateLabel('Status:', 5, 430, 210, 30)
    Global $label2 = GUICtrlCreateLabel('0 / 0', 410, 430, 130, 30)
    GUICtrlSetColor($label2, 0xFF0000)
    Global $button1 = GUICtrlCreateButton('>>', 170, 200, 45, 25)
    Global $button2 = GUICtrlCreateButton('Start', 220, 420, 70, 30)
    Global $button3 = GUICtrlCreateButton('Save', 170, 240, 45, 25)
    GUICtrlSetState($button2, 128)
    GUICtrlSetState($button3, 128)
    GUICtrlSetOnEvent($button1, '_button1')
    GUICtrlSetOnEvent($button2, '_button2')
    GUICtrlSetOnEvent($button3, '_button3')
    GUICtrlSetOnEvent($mnitem1, '_exit')
    GUICtrlSetOnEvent($ctitem1, '_delip')

    GUISetState(@SW_SHOW, $gui1)
    _readfile()
    While 1
        Sleep(50)
    WEnd

    Func _exit()
        Exit
    EndFunc   ;==>_exit

    Func _readfile()
        Local $data = FileRead($path)
        If @error Then Return
        GUICtrlSetData($input1, $data)
    EndFunc   ;==>_readfile

    Func _delip()
        If GUICtrlRead(GUICtrlRead($listview1)) <> '0' Then
            Local $ipdel = StringSplit(GUICtrlRead(GUICtrlRead($listview1)), '|')
            Local $find = _GUICtrlListView_FindText($listview1, $ipdel[1])
            If $find <> -1 Then
                _GUICtrlListView_DeleteItem($listview1, $find) ;remove ip in NG list
                $total -= 1
                GUICtrlSetData($label2, '0 / ' & $total)
            EndIf
        EndIf
    EndFunc

    Func _button1()
        Local $data1 = GUICtrlRead($input1)
        Local $ar = StringSplit($data1, @CR)
        If @error Then Return
        GUICtrlSetState($input1, 128)
        GUICtrlSetState($button1, 128)
        _GUICtrlListView_DeleteAllItems($listview1)
        GUICtrlSetData($label1, 'Status: Loading Camera IP ...')
        $total = 1
        For $i = 1 To $ar[0]
            Local $data2 = StringStripWS($ar[$i], 8)
            If _isipv4($data2) Then
                Local $find = _GUICtrlListView_FindText($listview1, $data2)
                If $find = -1 Then
                    GUICtrlCreateListViewItem($data2, $listview1)
                    $total += 1
                EndIf
            EndIf
        Next
        GUICtrlSetState($button2, 64)
        GUICtrlSetState($button3, 64)
        GUICtrlSetData($label2, '0 / ' & $total)
        GUICtrlSetData($input1, '> The list has been loaded!')
        GUICtrlSetData($label1, 'Status: Done ! Press Start ...')
    EndFunc   ;==>_button1

    Func _button2()
        GUICtrlSetState($button3, 128)
        GUICtrlSetState($ctitem1, 128)
        GUICtrlSetState($button2, 128)
        GUICtrlSetState($mnitem1, 128)
        GUICtrlSetData($label1, 'Status: In Progress .')
        _newthread()
    EndFunc   ;==>_button2

    Func _button3()
        GUICtrlSetState($button3, 128)
        _RunDos("del /f /a /q " & $path)
        For $i = 0 To _GUICtrlListView_GetItemCount($listview1) - 1
            FileWriteLine($path, _GUICtrlListView_GetItemText($listview1, $i))
        Next
        MsgBox(0, 'Save', 'Done !', 3, $gui1)
    EndFunc   ;==>_button3

    Func _newthread()
        Local $max = _GUICtrlListView_GetItemCount($listview1)
        Local $k = 0
        $ngno = 0
        While 1
            Local $ip = _GUICtrlListView_GetItemText($listview1, $k)
            Local $ping = Ping($ip, 1000)
            If $ping Then ;ping OK
                Local $find = _GUICtrlListView_FindText($listview2, $ip)
                If $find <> -1 Then
                    _GUICtrlListView_DeleteItem($listview2, $find) ;remove ip in NG list
                    $ngno -= 1
                    GUICtrlSetData($label2, $ngno & ' / ' & $total)
                    _GUICtrlListView_SimpleSort($listview2, $sortSense, 0, False)
                EndIf
            Else ;ping NG
                If _pingcheck($ip) Then
                    $find = _GUICtrlListView_FindText($listview2, $ip)
                    If $find <> -1 Then
                        _GUICtrlListView_DeleteItem($listview2, $find) ;remove ip in NG list
                        $ngno -= 1
                        GUICtrlSetData($label2, $ngno & ' / ' & $total)
                        _GUICtrlListView_SimpleSort($listview2, $sortSense, 0, False)
                    EndIf
                Else
                    $find = _GUICtrlListView_FindText($listview2, $ip)
                    If $find = -1 Then
                        GUICtrlCreateListViewItem($ip, $listview2) ;add ip to NG list
                        $ngno += 1
                        GUICtrlSetData($label2, $ngno & ' / ' & $total)
                        _GUICtrlListView_SimpleSort($listview2, $sortSense, 0, False)
                    EndIf
                EndIf
            EndIf
            $k += 1
            If $k = Round($max / 3) Then GUICtrlSetData($label1, 'Status: In Progress ...')
            If $k = Round($max * 2 / 3) Then GUICtrlSetData($label1, 'Status: In Progress .....')
            If $k = $max Then
                $k = 0
                GUICtrlSetData($label1, 'Status: In Progress .')
                Sleep(5000)
            EndIf
            Sleep(10)
        WEnd
    EndFunc   ;==>_newthread

    Func _isipv4($sip)
        Local $strspp = StringSplit($sip, ".")
        If $strspp[0] <> 4 Then Return False
        For $i = 1 To 4
            If $strspp[$i] = "" Then Return False
        Next
        For $i = 1 To 4
            If $strspp[$i] < 0 Or $strspp[$i] > 255 Then Return False
        Next
        $strspp = StringSplit($sip, "")
        For $i = 1 To UBound($strspp) - 1
            Local $check = 0
            For $j = 0 To 10
                If $strspp[$i] == $arr[$j] Then
                    $check = 1
                    ExitLoop
                EndIf
            Next
            If $check = 0 Then Return False
            $check = 0
        Next
        Return True
    EndFunc   ;==>_isipv4

    Func _RunDos($scommand)
        Local $nresult = RunWait(@ComSpec & " /C " & $scommand, "", @SW_HIDE)
        Return SetError(@error, @extended, $nresult)
    EndFunc   ;==>_RunDos

    Func _pingcheck($ipadrr)
        Local $process = Run(@ComSpec & " /C ping " & $ipadrr & " -n 1", "", @SW_HIDE, 2)
        ProcessWaitClose($process)
        Local $result = StdoutRead($process)
        If StringInStr($result, 'TTL=') <> 0 Then
            Return True
        Else
            Return False
        EndIf
    EndFunc   ;==>_pingcheck
     
     
  5. fantasizzz

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

    Tham gia ngày:
    28/4/18
    Bài viết:
    13
    Đã được thích:
    4
    nếu vòng lặp đơn giản chỉ check này nọ thì sài hàm _Timer_SetTimer và _Timer_KillTimer cũng dc, đa vòng lặp sử dụng hàm timer cũng khá hiểu quả
     
  6. LVT491

    LVT491 Thành viên
    • 18/23

    Tham gia ngày:
    22/12/16
    Bài viết:
    46
    Đã được thích:
    26
    Thank bác fantasizzz, iêm sẽ ngâm cứu cái đó xem. Hỏi ngoài lề xíu: ở cái GuictrlCreateInput kia làm sao để khi bấm enter nó xuống dòng, ... như mình nhập ở file text ấy nhỉ các bác
     
  7. fantasizzz

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

    Tham gia ngày:
    28/4/18
    Bài viết:
    13
    Đã được thích:
    4
    Sài GUICtrlCreateEdit
     
  8. LVT491

    LVT491 Thành viên
    • 18/23

    Tham gia ngày:
    22/12/16
    Bài viết:
    46
    Đã được thích:
    26
    Sài edit bấm enter nó cũng xuống dòng đâu bác
     
  9. NPPT

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

    Tham gia ngày:
    24/8/18
    Bài viết:
    7
    Đã được thích:
    10
  10. hoangvq

    hoangvq Thành viên
    • 8/11

    Tham gia ngày:
    12/7/18
    Bài viết:
    29
    Đã được thích:
    7
    Ở func bỏ while, tại vòng lặp chính gọi func, đó là cách đơn giản nhất
     
    LVT491 thích bài này.
  11. LVT491

    LVT491 Thành viên
    • 18/23

    Tham gia ngày:
    22/12/16
    Bài viết:
    46
    Đã được thích:
    26
    Thanks các bác iêm sửa tất cả ok rồi hehe
     
    Chỉnh sửa cuối: 24/8/18
Trạng thái chủ đề:
Không mở trả lời sau này.

Chia sẻ trang này

Đang tải...