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

Crash GUI


Rekomendowane odpowiedzi

Opublikowano

Siema. Kieruję prośbę o pomoc głównie do zaawansowanych programistów którzy znają bardzo dobrze AutoIt.

Otóż robię program w au3 za którego pomoca można prowizorycznie wyświetlać grafikę w batch'u (CMD). Napotkał mnie problem który miałem już kiedyś z innym programem i nadal nie został on rozwiązany Click. Dokładnie chodzi mi o to że zapętliłem użycie mojego programu, działa on jakiś czas po czym chyba brakuje mu RAM'U (lol? widać na filmie) i wtedy jeb całe gui, ogólnie grafika sie rozpierdala. Całe działanie programu jest proste: Program pobiera parametry > robi GUI > za pomocą WinApi_SetParent() skleja okno konsoli i GUI > odbiera parametry do zmiany GUI

Tutaj kodzik:
 

 

 

#NoTrayIcon
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=graph.ico
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <String.au3>
#include <WinApi.au3>
Func _Transparent($hWnd)
    Local $aM_Mask, $aCtrlPos, $aMask

    $aM_Mask = DllCall("gdi32.dll", "long", "CreateRectRgn", "long", 0, "long", 0, "long", 0, "long", 0)
    $aLastID = DllCall("user32.dll", "int", "GetDlgCtrlID", "hwnd", GUICtrlGetHandle(-1))

    For $i = 3 To $aLastID[0]
        $aCtrlPos = ControlGetPos($hWnd, '', $i)
        If Not IsArray($aCtrlPos) Then ContinueLoop

        $aMask = DllCall("gdi32.dll", "long", "CreateRectRgn", _
            "long", $aCtrlPos[0], _
            "long", $aCtrlPos[1], _
            "long", $aCtrlPos[0] + $aCtrlPos[2], _
            "long", $aCtrlPos[1] + $aCtrlPos[3])
        DllCall("gdi32.dll", "long", "CombineRgn", "long", $aM_Mask[0], "long", $aMask[0], "long", $aM_Mask[0], "int", 2)
    Next
    DllCall("user32.dll", "long", "SetWindowRgn", "hwnd", $hWnd, "long", $aM_Mask[0], "int", 1)
EndFunc
Opt("WinTitleMatchMode", 2)
If $CmdLine[0] < 1 Then Exit
Switch $CmdLine[1]
	Case "/start"
		If $CmdLine[0] < 2 Then Exit
		FileDelete(@TempDir&"\graph")
		ShellExecute(@AutoItExe,"/run "&$CmdLine[2])
	Case "/run"
		start()
	Case "/hide" ;/hide ID
		If $CmdLine[0] < 2 Then Exit
		;ClipPut("OFF,"&$CmdLine[2])
		While 1
			Sleep(25)
			If Not FileExists(@TempDir&"\graph") Then ExitLoop
		WEnd
		FileWrite(@TempDir&"\graph","OFF,"&$CmdLine[2])
	Case "/move" ;/move ID char/pixel X Y
		If $CmdLine[0] < 5 Then Exit
		If $CmdLine[3] = "char" Then
		$X = $CmdLine[4]*8
		$Y = $CmdLine[5]*12
	ElseIf $CmdLine[3] = "pixel" Then
		$X = $CmdLine[4]
		$Y = $CmdLine[5]
	Else
		Exit
	EndIf
		;ClipPut("MOVE,"&$CmdLine[2]&","&$X&","&$Y)
		While 1
			Sleep(25)
			If Not FileExists(@TempDir&"\graph") Then ExitLoop
		WEnd
		FileWrite(@TempDir&"\graph","MOVE,"&$CmdLine[2]&","&$X&","&$Y)
	Case "/exit"
		While 1
			Sleep(25)
			If Not FileExists(@TempDir&"\graph") Then ExitLoop
		WEnd
		FileWrite(@TempDir&"\graph","EXIT")
	Case "/fill"
		If $CmdLine[0] < 8 Then Exit ;/fill ID pixel/char X Y SizeX SizeY Obrazek
		If $CmdLine[3] = "char" Then
			$X = $CmdLine[4]*8
			$Y = $CmdLine[5]*12
			$SizeX = $CmdLine[6]*8
			$SizeY = $CmdLine[7]*12
		ElseIf $CmdLine[3] = "pixel" Then
			$X = $CmdLine[4]
			$Y = $CmdLine[5]
			$SizeX = $CmdLine[6]
			$SizeY = $CmdLine[7]
		Else
			Exit
		EndIf
		;ClipPut("")
		;ClipPut("FILL,"&$CmdLine[2]&","&$X&","&$Y&","&$SizeX&","&$SizeY&","&$CmdLine[8])
		While 1
			Sleep(25)
			If Not FileExists(@TempDir&"\graph") Then ExitLoop
		WEnd
		FileWrite(@TempDir&"\graph","FILL,"&$CmdLine[2]&","&$X&","&$Y&","&$SizeX&","&$SizeY&","&$CmdLine[8])
	EndSwitch
Exit
Func start() ;/run "title of cmd"
	If $CmdLine[0] < 2 Then Exit
	$hConsole =WinGetHandle( $CmdLine[2])
	$hSize = WinGetPos($hConsole)
	Global $hGUI = GUICreate("GUI of Graph - "&Random(0,32000,1),$hSize[2],$hSize[3],-1,-1,$WS_POPUP,$WS_EX_TOOLWINDOW)
	GUISetBkColor(0x000000)
	_Transparent($hGUI)
	_WinAPI_SetParent($hGUI,$hConsole)
	_WinAPI_MoveWindow($hGUI,0,0,$hSize[2],$hSize[3])
	GUISetState(@SW_SHOW)
	Sleep(50)
	_WinAPI_RedrawWindow($hGUI)
	Local $hIDs[50001]
	$hIDs[0] = 2
	While 1
		Sleep(25)
		Local $hClip = StringSplit(FileRead(@TempDir&"\graph"),",")
		If FileRead(@TempDir&"\graph") = "EXIT" Then
			FileDelete(@TempDir&"\graph")
			Exit
		ElseIf $hClip[1] = "OFF" Then
			FileDelete(@TempDir&"\graph")
			For $i = 1 To $hIDs[0] Step 2
				If $hIDs[$i] = $hClip[2] Then
					GUICtrlDelete($hIDs[$i+1])
					_Transparent($hGUI)
					_WinAPI_RedrawWindow($hGUI)
				EndIf
			Next
		ElseIf $hClip[1] = "MOVE" Then
			FileDelete(@TempDir&"\graph")
			For $i = 1 To $hIDs[0]
				If $hIDs[$i] = $hClip[2] Then
					GUICtrlSetPos($hIDs[$i+1],$hClip[3],$hClip[4])
					_Transparent($hGUI)
					_WinAPI_RedrawWindow($hGUI)
				EndIf
			Next
		ElseIf $hClip[1] = "FILL" Then
			FileDelete(@TempDir&"\graph")
			$hID = $hClip[2]
			$hPic = $hClip[7]
			$hIDs[$hIDs[0]+1] = $hID
			$hIDs[$hIDs[0] + 2] = GUICtrlCreatePic($hPic,$hClip[3],$hClip[4],$hClip[5],$hClip[6])
			_Transparent($hGUI)
			_WinAPI_RedrawWindow($hGUI)
			$hIDs[0] += 2
		EndIf
		If WinActive($hGUI) Then WinActivate($hConsole)
		If Not WinActive($hConsole) Then
			While 1
				Sleep(25)
				If WinActive($hConsole) Or WinActive($hGUI) Then ExitLoop
			WEnd
			Sleep(50)
			_WinAPI_RedrawWindow($hGUI)
		EndIf
	WEnd
EndFunc

 

 

 

I filmik z tym co się dzieje po wzroście zużycia pamięci:

 

 

 


 

 

 

Proszę aby ktoś mi pomógł rozwiązać ten problem. Poprawić kod czy cośtam bo początkujący jestem i staram sie robić to co umiem najlepiej jednakże nie wychodzi mi to czasem najlepiej. Sądze że to wina GUI bo w moim wczesniejszym programie była pętla ze zmienianiem obrazka w kontrolce i właśnie wtedy pamięć wzrastała. A i darujcie sobie odpowiedzi typu "ten kod sie nadaje do wyjebania" itp prosze o konkretną pomoc co zrobić co zmienić, poprawić.

Cipka - Najlepszy silnik na świecie. Działa z tłokiem każdej średnicy, wbudowana funkcja samosmarowania, odpalasz jednym palcem i co miesiąc sam się wymienia olej. Szkoda tylko że ma taki pojebany komputer pokładowy.

Opublikowano

Nie musisz wywoływać z DLLek funkcji GDI, są one zaimplementowane w autoicie.

A zamiast bawić się z robieniem konsoli to polecam albo

a) stworzyć ją sobie przy pomocy AllocConsole (nie pamiętam w której DLLce to było) i przekierować strumienie do siebie

B) przenieść się na c++

846331404756772371599.jpeg
Opublikowano

Ja sie nie bawie w robienie konsoli tylko w wyświetlanie obrazków w konsoli a to jest zdecydowanie błąd autoita a dokładniej gui tylko nie wiem jaki. I napisałem że prosze o konkertną odpowiedź co mam poprawić.

Co do AllocConsole jest to w kernel32.dll jest nawet UDF Console

 

Tak na marginesie to chyba wgl nie zrozumiałeś o co mi chodzi...

Cipka - Najlepszy silnik na świecie. Działa z tłokiem każdej średnicy, wbudowana funkcja samosmarowania, odpalasz jednym palcem i co miesiąc sam się wymienia olej. Szkoda tylko że ma taki pojebany komputer pokładowy.

Opublikowano

@ref :O

Cipka - Najlepszy silnik na świecie. Działa z tłokiem każdej średnicy, wbudowana funkcja samosmarowania, odpalasz jednym palcem i co miesiąc sam się wymienia olej. Szkoda tylko że ma taki pojebany komputer pokładowy.

Opublikowano

@ref :O :O

Cipka - Najlepszy silnik na świecie. Działa z tłokiem każdej średnicy, wbudowana funkcja samosmarowania, odpalasz jednym palcem i co miesiąc sam się wymienia olej. Szkoda tylko że ma taki pojebany komputer pokładowy.

Opublikowano

@ref

To chyba nie wina GUI tylko _Transparent() i _WinApi_RedrawWindow() bo zauważyłem że czym wolniej są wywoływane w pętli to dłużej nie ma efektu z filmu ktoś ma jakiś pomysł???

Cipka - Najlepszy silnik na świecie. Działa z tłokiem każdej średnicy, wbudowana funkcja samosmarowania, odpalasz jednym palcem i co miesiąc sam się wymienia olej. Szkoda tylko że ma taki pojebany komputer pokładowy.

Opublikowano

@ref

Cipka - Najlepszy silnik na świecie. Działa z tłokiem każdej średnicy, wbudowana funkcja samosmarowania, odpalasz jednym palcem i co miesiąc sam się wymienia olej. Szkoda tylko że ma taki pojebany komputer pokładowy.

Opublikowano

@ref? :O

Cipka - Najlepszy silnik na świecie. Działa z tłokiem każdej średnicy, wbudowana funkcja samosmarowania, odpalasz jednym palcem i co miesiąc sam się wymienia olej. Szkoda tylko że ma taki pojebany komputer pokładowy.

Opublikowano

hmmm @ref :O

Cipka - Najlepszy silnik na świecie. Działa z tłokiem każdej średnicy, wbudowana funkcja samosmarowania, odpalasz jednym palcem i co miesiąc sam się wymienia olej. Szkoda tylko że ma taki pojebany komputer pokładowy.

Opublikowano

Jak zrobisz z tego minimalny kawałek kodu prezentujący problem i opiszesz jak go użyć to mogę spróbować pomóc. Na razie nie chce mi się myśleć jak to odpalić nawet.

Opublikowano

@up Łap
 

 

 

#NoTrayIcon
#include <WinApi.au3>
#include <WindowsConstants.au3>
HotKeySet("{END}","off")
$GUI = GUICreate("Crash Test",500,500,$WS_POPUP,$WS_EX_TOOLWINDOW)
$Pic = GUICtrlCreatePic("OBRAZEK.BMP",200,200,50,50)
GUISetState(@SW_SHOW)
While 1
	_Transparent($GUI)
	_WinAPI_RedrawWindow($GUI)
WEnd
Func _Transparent($hWnd)
Local $aM_Mask, $aCtrlPos, $aMask

$aM_Mask = DllCall("gdi32.dll", "long", "CreateRectRgn", "long", 0, "long", 0, "long", 0, "long", 0)
$aLastID = DllCall("user32.dll", "int", "GetDlgCtrlID", "hwnd", GUICtrlGetHandle(-1))

For $i = 3 To $aLastID[0]
$aCtrlPos = ControlGetPos($hWnd, '', $i)
If Not IsArray($aCtrlPos) Then ContinueLoop

$aMask = DllCall("gdi32.dll", "long", "CreateRectRgn", _
"long", $aCtrlPos[0], _
"long", $aCtrlPos[1], _
"long", $aCtrlPos[0] + $aCtrlPos[2], _
"long", $aCtrlPos[1] + $aCtrlPos[3])
DllCall("gdi32.dll", "long", "CombineRgn", "long", $aM_Mask[0], "long", $aMask[0], "long", $aM_Mask[0], "int", 2)
Next
DllCall("user32.dll", "long", "SetWindowRgn", "hwnd", $hWnd, "long", $aM_Mask[0], "int", 1)
EndFunc
Func off()
	Exit
EndFunc

 

 

 

Gdzie "OBRAZEK.BMP" dajesz ścieżę do swojego obrazka

Dodatkowo dodam że kolor tego migającego gówna na całym pulpicie zależy od koloru tła GUI nie następuje to od razu trzeba trochę poczekać. Zastanawia mnie teraz czy to wina _WinApi_RedrawWindow() czy _Transparent() Zauważyłem że czas oczekiwania na crash jest zależny od szybkości wykonywania pętli czyli dasz w pętli np Sleep(250) i Wtedy efekt nastąpi później

Cipka - Najlepszy silnik na świecie. Działa z tłokiem każdej średnicy, wbudowana funkcja samosmarowania, odpalasz jednym palcem i co miesiąc sam się wymienia olej. Szkoda tylko że ma taki pojebany komputer pokładowy.

Opublikowano

Ale ja potrzebuję ją wywoływać po każdym dodaniu/skasowaniu obrazka bo inaczej zostaje czarny kwadrat lub nie pokazuje się obrazek. Po to jest mój program robi gui i dodaje obrazki na bieżąco

Cipka - Najlepszy silnik na świecie. Działa z tłokiem każdej średnicy, wbudowana funkcja samosmarowania, odpalasz jednym palcem i co miesiąc sam się wymienia olej. Szkoda tylko że ma taki pojebany komputer pokładowy.

Opublikowano

Okej, trochę zreserchowałem i doszedłem do wniosku, że problem leży w nie usuwaniu starych rectów

Wystarczy je usuwać po użyciu

Func _Transparent($hWnd)
	static $gdi = DllOpen("gdi32.dll") ;zeby bylo ladniej
	static $user = Dllopen("user32.dll")
	Local $aM_Mask, $aCtrlPos, $aMask

	$aM_Mask = DllCall($gdi, "long", "CreateRectRgn", "long", 0, "long", 0, "long", 0, "long", 0)
	$aLastID = DllCall($user, "int", "GetDlgCtrlID", "hwnd", GUICtrlGetHandle(-1))

	For $i = 3 To $aLastID[0]
		$aCtrlPos = ControlGetPos($hWnd, '', $i)
		If Not IsArray($aCtrlPos) Then ContinueLoop

		$aMask = DllCall($gdi, "long", "CreateRectRgn", _
				"long", $aCtrlPos[0], _
				"long", $aCtrlPos[1], _
				"long", $aCtrlPos[0] + $aCtrlPos[2], _
				"long", $aCtrlPos[1] + $aCtrlPos[3])
		DllCall($gdi, "long", "CombineRgn", "long", $aM_Mask[0], "long", $aM_Mask[0], "long", $aMask[0], "int", 2)
		$r = dllcall($gdi, "bool", "DeleteObject", "long", $aMask[0]) ;dodalem to
	Next
	DllCall($user, "long", "SetWindowRgn", "hwnd", $hWnd, "long", $aM_Mask[0], "int", 1)
	$r = dllcall($gdi, "bool", "DeleteObject", "long", $aM_Mask[0]) ;i to
EndFunc   ;==>_Transparent
Opublikowano

Nie no człowieku jesteś zajebisty! Kocham Cię <3

Cipka - Najlepszy silnik na świecie. Działa z tłokiem każdej średnicy, wbudowana funkcja samosmarowania, odpalasz jednym palcem i co miesiąc sam się wymienia olej. Szkoda tylko że ma taki pojebany komputer pokładowy.

Zarchiwizowany

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

×
×
  • Dodaj nową pozycję...