Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

[Pytanie] Osobny Wątek Program


Rekomendowane odpowiedzi

Opublikowano

Czy znacie jakąś funkcję, która odpali mi inną funkcję tylko jeden raz w osobnym wątku?

roomy.png

Wczoraj do ciebie nie należy. Jutro niepewne... Tylko dziś jest twoje.

Opublikowano

Ciekawe rozwiązanie - ale co do tego timera mam pytanie: Czy jeśli w funkcji mam pętlę i zabije timera w trakcie jej wykonywania to pętla się przerwie?

Nie myślcie, że nie wiedziałem o timerach i adlibach bo zaraz Maciek przyjdzie i zacznie pisać, że jestem totalne zero xD @EDIT - nie chciałem być źle zrozumiany to jest żart

 

dzięki robem

roomy.png

Wczoraj do ciebie nie należy. Jutro niepewne... Tylko dziś jest twoje.

Opublikowano

AdlibRegister("ble",1000)-startuje funkcje w ktorej jest to co ci trzeba + $x=1
if $x=1 then AdlibUnRegister("ble") 

mozesz ich uzyc wiem ze wiesz ale tak dla przykladu zastosowania:D

Do
$wiek+=1
Until ŻycieGetMsg() = -3

zbieram +

Opublikowano

Ani AdLibRegister ani Timer NIE JEST OSOBNYM WĄTKIEM!

 

Czy jeśli w funkcji mam pętlę i zabije timera w trakcie jej wykonywania to pętla się przerwie?

Nie.

SetTimer to fukncja w WinApi, która rejestruje funkcję callback na kod WM_TIMER (tak jak są kody WM_MOUSEMOVE wysyłane do WindowProc przy ruszaniu myszki, tak kod WM_TIMER, po zarejestrowaniu funkcji Callback, jest wysyłany dokładnie co X milisekund).

 

Wysłałem ci tk na PM kod pokazujący wykorzystanie SetTimer z GuiRegisterMsg -> co jest __dokładnie równoważne__ podowaniem pointera do funkcji przy wywoływaniu SetTimer (sposób AdLibRegister).

 

To __nie_jest__ osobny wątek. To jest funkcja callback rejestrowana i wywoływana co X czasu.

 

- - - - - - - - - -

 

W AutoIT'cie jest tylko jeden sposób na wielowątkowość, a mianowicie uruchamianie dwóch skryptów jednocześnie.

 

Najłatwiej można to osiągnąć poprzez:

 

$sAutoitExePath = "E:\Program Files\AutoIt3\autoit3.exe"


$string = " For $i = 0 to 4 " & @CRLF & _
" MsgBox(0,'4ggr35510n', 'Autoit Pseudo-multithreading') " & @CRLF & _
" Next "

$hFile = FileOpen("multithread.au3", 2)

FileWrite( $hFile, $string )

If Not FileExists("multithread.au3") Then
ConsoleWrite('! Something somewhere went terribly wrong...' & @CRLF)
Else
Run ( $sAutoitExePath & ' "' & @ScriptDir & '\multithread.au3' & '"' )
EndIf

For $i = 0 to 4
MsgBox(0, '', "Czeka cię DUUUŻO MsgBox'ów!")
Next

FileDelete($hFile)

Exit

 

Ustaw odpowiednie $sAutoitExePath na początku. Można zczytać odpowiednie z rejestru windows (jeśli Autoit w ogóle jest zainstalowany) lub użyć pośredniego, jeśli dostarczasz Autoit3.exe wraz z własną aplikacją.

 

- - - - -- - - -- -

 

Jednak, jestem absolutnie przekonany, że twoje potrzeby mogą być zaspokojone ;> za pomocą tylko jednego wątku :]

 

Napisz dokładnie czego potrzebujesz (w całości), a poradzimy Ci, jak to zrobić w jednym wątku.

Ta sygnatura jest pusta.

Opublikowano

a czym jest adlib? Wykonuje się nie zależenie w tym samym czasie co reszta kodu, jest wywoływany co ileś tam czasu, to że nie jest nowym wątkiem to nie znaczy że nie spełnia funkcji wątku, pozatym całkowita wielowątkowość jest NIEMOŻLIWA na każdym procesorze jedno rdzeniowym.

Opublikowano

bardziej odpowiada że co jakiś czas jest wywoływana i wykonywana funkcja zarejestrowana w AdLibRegister , czas ustawiasz co ile

 

nie musisz się już martwić wywoływaniem tej funkcji , na czas wykonywanie główna zostaje zapauzowana , wykonana funkcja z AdLibRegister i odpauzowana główna ( taka pseudowątkowość ale bardziej pasuje kolejka w wykonywaniu lini skryptu ) , czas wykonania tej funkcji jest tak mały że nawet tego nie zauważysz w działaniu

 

dlatego używając AdLibRegister nie powinno się używać za dużo Sleep by nie przymulić głównego skryptu, i funkcja w nim wykonywana powinna być w miarę prosta a nie zajmująca kilka czy kilkadziesiąt sekund

 

w bocie możesz np , co 10 s ustawić sprawdzanie hp/mp i jak ma określoną wartość użycie potka , to co 10 s główny skrypt się zatrzyma na kilka ms by wykonać sprawdzanie i akcje jeśli trzeba jak skończy , odpauzuje główną funkcje

 

inny sposób na tą pseudowielowątkowość jest też uruchomieni dodatkowego programu sterowanego tylko z programu głównego ( niektóre boty mają 2-3 exe dodatkowe każdy robiący co innego )

If you = stupid then

insert(foot.in.your.ass)

end if

licznik-54-96732-stat.png

Opublikowano
Wykonuje się nie zależenie w tym samym czasie co reszta kodu

 

No właśnie ci tłumaczyłem, że nie =.=

 

Jest tylko zarejestrowaniem funkcji callback wywoływanej w stałych odstępach czasu.

 

Spróbuj do tej funkcji wrzucić sleep'a. Albo wykonuj jednocześnie dłuuugą pętlę w funkcji callback jak i w głównej pętli. Zobacz, czy kolejne instrukcje będą wykonywane równolegle :P

 

- - -

 

I to bardzo ciekawe, co piszesz o "całkowitej wielowątkowości".

Wielowątkowość może także odnosić się do samych procesorów. W takim wypadku oznacza możliwość jednoczesnego wykonywania wielu wątków sprzętowych na pojedynczej jednostce wykonawczej – rdzeniu (ang. core).

A skąd ty zaczerpnąłeś definicję...? :]

 

- - -

 

Robem:

Zgadzam się, plus. Tylko, że AdLibRegister / SetTimer jest bardziej pseudo od dwóch exeków :] Bo przy 2x exe masz faktycznie dwa wątki w windowsie, którymi równoległym wykonaniem zarządza OS, a przy SetTimer masz dwie pętle i jedna wskakuje w drugą.

Ta sygnatura jest pusta.

Opublikowano

a czemu jeśli ustawie 30 adlibó z powtarzaniem co 1 mls to zużycie procka to zero ?

 

W adlibach sprawdzanie kolizji, updatowanie 100 elementów gui.

 

Swoją drogą jak ustawić by skrypt przyjmował argumenty ?

Tak jak np 'shutdown -f'

Opublikowano

W helpie masz to opisane, parametry podawane przy uruchomieniu przechowywane sa w jakiejs zmiennej, $cmdline albo jakos tak, nie mam au3 na fonie wiec nie sprawdze, ale jak wyszukasz /command line/ albo /start parameters/ lub nawet samo /parameters/ to na pewno znajdziesz.

[TUT] Full Autoit V3 Tutorial

yo po 1 nie kayloger tylko bot który zapamiętuje hasła -_-

stop1.png

Opublikowano
Napisz dokładnie czego potrzebujesz (w całości), a poradzimy Ci, jak to zrobić w jednym wątku.

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <ProgressConstants.au3>
Opt("GUIOnEventMode", 1)
#Region ### START Koda GUI section ### Form=
$FormMain = GUICreate("FDownloader", 257, 131, 353, 284)
$MenuItem1 = GUICtrlCreateMenu("O Programie")
$MenuItem2 = GUICtrlCreateMenu("Pomoc")
GUISetOnEvent($GUI_EVENT_CLOSE, "Terminate")
GUICtrlCreateLabel("Adres URL:", 8, 8, 59, 17)
$InputURL = GUICtrlCreateInput("", 8, 32, 241, 21, BitOR($ES_AUTOVSCROLL,$ES_AUTOHSCROLL))
GUICtrlCreateLabel("Nazwa pliku:", 8, 56, 65, 17)
$InputNazwa = GUICtrlCreateInput("", 8, 80, 153, 21, BitOR($ES_AUTOVSCROLL,$ES_AUTOHSCROLL))
$ButtonStart = GUICtrlCreateButton("START", 168, 64, 83, 41, $WS_GROUP)
GUICtrlSetOnEvent($ButtonStart, "DownloadBegin")
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
Func Terminate()
Exit
EndFunc;<==Terminate
Func DownloadBegin()
AdlibRegister("Download")
EndFunc;<==DownloadBegin
Func Download()
AdlibUnRegister("Download")
$URL = GUICtrlRead($InputURL)
$Nazwa = GUICtrlRead($InputNazwa)
$FormDownload = GUICreate($Nazwa, 256, 16, 0, 0, "", "", $FormMain)
$Progress1 = GUICtrlCreateProgress(0, 0, 256, 16, $PBS_SMOOTH)
GUISetState(@SW_SHOW)
$inet = InetGet($URL, $Nazwa, "", 1)
Do
	$progress = Int((InetGetInfo($inet, 0)/InetGetInfo($inet, 1))*100)
	GUICtrlSetData($Progress1, $progress)
Until InetGetInfo($inet, 3) = 1
GUIDelete($FormDownload)
EndFunc;<==Download
While 1
Sleep(100)
WEnd

 

Zdziwiło mnie to, że nawet managery pobierania nie zapisują poprawnie pewnych plików - więc postanowiłem zrobić swoje cudo, ale nie wiedziałem, że to będzie takie trudne pod pewnym względem: chcę osiągnąć teoretycznie nieskończoną liczbę pobierań jednocześnie bez dodawania kolejnej funkcji pobierania takiej jak ta download (bo tak jest najprościej).

 

@4ggr35510n: Wiem, że mi tłumaczyłeś, ale ja staram się używać prostego języka (mowy) - aby każdy to zrozumiał i abym sam się nie pogubił :)

roomy.png

Wczoraj do ciebie nie należy. Jutro niepewne... Tylko dziś jest twoje.

Opublikowano

GUICreate('')

$h1 = GUICtrlCreateProgress(10, 10, 300, 25)
$h2 = GUICtrlCreateProgress(10, 100, 300, 25)

GUISetState()

AdlibRegister('f1', 250)
AdlibRegister('f2', 250)

Func f1()
AdlibUnRegister('f1')
While True
	GUICtrlSetData($h1, Random(1, 100, 1))
WEnd
EndFunc

Func f2()
AdlibUnRegister('f2')
While True
	GUICtrlSetData($h2, Random(1, 100, 1))
WEnd
EndFunc


Do
Until GuiGetMsg() = -3


Exit

 

Powodzenia.

Nie zrobisz w ten sposób.

 

Musisz stworzyć tablicę w której będziesz przechowywał handle do zmiennych $inet i co rozsądna* ilośc czasu update'ować wszystkie Progressy zgodnie ze wszystkimi $inetami.

 

 

 

 

 

 

 

* jeśli plik waży 1 GB, a czułość Progress'u jest ustalona, można wyliczyć, znając prędkość łącza, co jaką najmniejszą liczbę czasu Progress w ogóle może się zmieniać.

Ta sygnatura jest pusta.

Opublikowano

a czemu jeśli ustawie 30 adlibó z powtarzaniem co 1 mls to zużycie procka to zero ?

 

W adlibach sprawdzanie kolizji, updatowanie 100 elementów gui.

 

Swoją drogą jak ustawić by skrypt przyjmował argumenty ?

Tak jak np 'shutdown -f'

run() :D

Opublikowano

Zrobiłem! :)

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <ProgressConstants.au3>
#include <Array.au3>
Dim $FormDownload[1], $Progress1[1], $inet[1]
Opt("GUIOnEventMode", 1)
#Region ### START Koda GUI section ### Form=
$FormMain = GUICreate("FDownloader", 257, 131, 353, 284)
$MenuItem1 = GUICtrlCreateMenu("O Programie")
$MenuItem2 = GUICtrlCreateMenu("Pomoc")
GUISetOnEvent($GUI_EVENT_CLOSE, "Terminate")
GUICtrlCreateLabel("Adres URL:", 8, 8, 59, 17)
$InputURL = GUICtrlCreateInput("", 8, 32, 241, 21, BitOR($ES_AUTOVSCROLL,$ES_AUTOHSCROLL))
GUICtrlCreateLabel("Nazwa pliku:", 8, 56, 65, 17)
$InputNazwa = GUICtrlCreateInput("", 8, 80, 153, 21, BitOR($ES_AUTOVSCROLL,$ES_AUTOHSCROLL))
$ButtonStart = GUICtrlCreateButton("START", 168, 64, 83, 41, $WS_GROUP)
GUICtrlSetOnEvent($ButtonStart, "DownloadBegin")
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
Func Terminate()
Exit
EndFunc;<==Terminate
Func DownloadBegin()
AdlibRegister("Download")
EndFunc;<==DownloadBegin
Func Download()
AdlibUnRegister("Download")
$URL = GUICtrlRead($InputURL)
$Nazwa = GUICtrlRead($InputNazwa)
_ArrayAdd($FormDownload, GUICreate($Nazwa, 256, 16, 0, 0, "", "", $FormMain))
_ArrayAdd($Progress1, GUICtrlCreateProgress(0, 0, 256, 16, $PBS_SMOOTH))
GUISetState(@SW_SHOW)
_ArrayAdd($inet, InetGet($URL, $Nazwa, "", 1))
EndFunc;<==Download
While 1
For $i In $inet
	$progress = Int((InetGetInfo($inet[$i], 0)/InetGetInfo($inet[$i], 1))*100)
	GUICtrlSetData($Progress1[$i], $progress)
	If InetGetInfo($inet[$i], 3) = 1 Then
		GUIDelete($FormDownload[$i])
		_ArrayDelete($FormDownload, $i)
		_ArrayDelete($Progress1, $i)
		_ArrayDelete($inet, $i)
	EndIf
Next
Sleep(100)
WEnd

roomy.png

Wczoraj do ciebie nie należy. Jutro niepewne... Tylko dziś jest twoje.

Opublikowano

Mam jeszcze jedno pytanko:

Do kontrolek istnieje coś takiego jak GuiCtrlSetData - potrzebny mi jest tego odpowiednik do zmiany nazwy okna.

 

#FUCK - duble post :/

 

Plusów wam nie dam, bo niestety wyczerpałem limit :)

roomy.png

Wczoraj do ciebie nie należy. Jutro niepewne... Tylko dziś jest twoje.

Opublikowano

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 633, 447, 192, 124)
$Button1 = GUICtrlCreateButton("Button1", 128, 24, 75, 25, $WS_GROUP)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
$nMsg = GUIGetMsg()
Switch $nMsg
	Case $GUI_EVENT_CLOSE
		Exit
	case $Button1
		WinSetTitle($form1, "", "My New Notepad")

EndSwitch
WEnd

@up

byłeś first

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...