Çözüldü Yazılan program çok fazla CPU tüketiyor

  • Konuyu başlatan Fuqy
  • Başlangıç Tarihi
  • Mesaj 19
  • Görüntüleme 1.203
Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

Fuqy

Decapat
Katılım
12 Şubat 2023
Mesajlar
11
Daha fazla  
Cinsiyet
Erkek
Python:
def key_listener():
    while True:
        if keyboard.is_pressed('f4'):
            yazi()
listener = threading.Thread(target=key_listener)
listener.start()
Yazdığım programda bu kısım çok fazla CPU tüketilmesine neden oluyor, bu kısıma alternatif olarak ne yapabilirim? Yapmak istediğim şey ise "F4" tuşuna basılınca kodların tetiklenmesi.
 
Son düzenleyen: Moderatör:
Çözüm
Ne yapması gerektiğini çok güzel anlatmışsınız. Magic numberlar da çok yardımcı oluyor.

Halkımızın arayüz fetişine hayranım. 2 satırı bir araya getiremez ama buton görüp tıklayacak. tkinter kullanmadığım ve kullanmayacağım için çalıştırıp sonucu görüp size bir şey diyemeyeceğim.
Koddaki tonla yanlış kullanıma değinmeyeceğim. Ama yazi isimli bir değişken ve fonksiyon olması aptallığına değinmeden edemeyeceğim. Soyadı diye bir şey niye var hiç düşündünüz mü?

"while True:" kısmını değiştirsek olur gibi sanki.
Yok canım, olur mu öyle şey? Çalışmadığı şekliyle çalışmasını bekleyip duralım.

Anladığım kadarıyla kutucuğa büyülü sözler yazıp f4'e basınca o büyülü sözleri ışık hızında yazdırmak istiyorsunuz.

Farklı şeyler yazabileceğiniz için try-except gerekiyor muhtemelen. O olmadan da denersiniz.

Kod:
from pynput import keyboard
from tkinter import *
import pyautogui


def yazi_olmamasi_gereken_ama_niyeyse_yazi_olan_yazi():
    geting = otoentry.get()
    pyautogui.typewrite(geting, interval=0.0000001)


def on_pressed(key):
    try:
        if key.name == "f4":
            yazi_olmamasi_gereken_ama_niyeyse_yazi_olan_yazi()
    except:
        pass


master = Tk()
master.title('Auto Writer')
icon = PhotoImage(file="Adsiz.png")
master.iconphoto(False, icon)
canvas = Canvas(master, height=200, width=400, bg='#000000')
canvas.pack()
master.resizable(width="FALSE", height="FALSE")
frame_sol = Frame(master, bg='#191919')
frame_sol.place(relx=0.01, rely=0.01, relwidth=0.25, relheight=0.98)
frame_sag = Frame(master, bg='#191919')
frame_sag.place(relx=0.74, rely=0.01, relwidth=0.25, relheight=0.98)
frame_main = Frame(master, bg='#191919')
frame_main.place(relx=0.27, rely=0.01, relwidth=0.46, relheight=0.98)
frame_start = Frame(frame_main, bg='#191919')
frame_start.place(relx=0.1, rely=0.14, relheight=0.06, relwidth=0.21)
otoentry = Entry(frame_main, font='Square 11 bold', width=20, bd=0, bg='#505050')
otoentry.place(relx=0.06, rely=0.04)
yazi = Label(frame_main, text='Start button is (F4)', bg='#191919', fg='#ffffff')
yazi.place(relx=0.08, rely=0.18)

listener = keyboard.Listener(on_press=on_pressed)
listener.start()

master.mainloop()
Adam niye tekerleği yeniden icat etsin? Üstüne kurulu kütüphane var. Low level uğraşacak olsa Python kullanmaz. Sistem programlama bilen birisi dokümantasyon okumayı bilip böyle konular açmaz.
Bahettiğim eğer kullandığı kütüphane while True gerektiriyor olsaydı o kütüphane yerine interrupt tabanlı bir kütüphane kullanması idi.
 
Buraya ufak bir ek time.sleep() kullanmak her zaman mantıksız değildir. time.sleep()'in doğru yerde kullanılması önemli.

Eğer ağır hesaplama yapılırken kullanırsanız yada binlerce istek gelen bir veritabanı sorgusundan önce kullanırsanız mantıksız. Ancak vakit almayacağından emin olduğunuz işlerde hiçte mantıksız değil.

Bu durumun production'daki kullanımlarına en net örneği javascriptteki setInterval fonksiyonu olabilir. Şuan technopat'ın xenforo forumunda bile birden çok kez kesin kullanılmıştır.
 
setInterval() lazım olduğu için kullanılıyor. Butonlara listener eklemeyip setInterval ile o an tıklanıp tıklanmadığını kontrol eden fonksiyon bağlanmıyor. Listener ile kaynak tüketmeden imkan var iken sleep kullanmak saçma. while True kullanmak bile saçma.
 
@Karşıt Madde adam da onu soruyor zaten.

Niye bir while ekleme gereği duyduğunuzu anlamadım. is_pressed() olan kütüphane güncellenmiyor. Gerçekten lazımdeğilse bunu kullanırdım.
Kod:
from pynput import keyboard

def on_pressed(key):
    if key.name == "f4":
        print("elma")

listener = keyboard.Listener(on_press=on_pressed)
listener.start()
listener.join()
İlla onu istiyorum diyorsanız.
Kod:
import keyboard

keyboard.add_hotkey('f4', lambda: print('elma'))
keyboard.wait("esc")
Programda birde arayüz kullanıyorum, ben bunu daha önce de denemiştim arayüz gelmemişti.
 
Nasıl (yanlış) kullandınız? Hangisini kullandınız?

Dediniz de iyice anlatın. Siz de ben de buranın başında oturmuyoruz tüm gün. Gram gram bilgi verecekseniz hiç hiç bilgi almaya başlamanız an meselesi.

Kodunuz devlet sırrı değil. Ticari değeri olsa yapmayı bilecek bilginiz olurdu. Hepsini paylaşın. Nerede ne yapmak istediğinizi anlatın.
 
Son düzenleme:
Nasıl (yanlış) kullandınız? Hangisini kullandınız?

Dediniz de iyice anlatın. Siz de ben de buranın başında oturmuyoruz tüm gün. Gram gram bilgi verecekseniz hiç hiç bilgi almaya başlamanız an meselesi.

Kodunuz devlet sırrı değil. Ticari değeri olsa yapmayı bilecek bilginiz olurdu. Hepsini paylaşın. Nerede ne yapmak istediğinizi anlatın.
Python:
from tkinter import *
import pyautogui
import keyboard
import threading

master = Tk()
master.title('Auto Writer')
icon = PhotoImage(file = "Adsiz.png")
master.iconphoto(False, icon)
canvas = Canvas(master, height=200, width=400, bg='#000000')
canvas.pack()
master.resizable(width="FALSE", height="FALSE")
frame_sol = Frame(master, bg='#191919')
frame_sol.place(relx=0.01, rely=0.01, relwidth=0.25, relheight=0.98)
frame_sag = Frame(master, bg='#191919')
frame_sag.place(relx=0.74, rely=0.01, relwidth=0.25, relheight=0.98)
frame_main = Frame(master, bg='#191919')
frame_main.place(relx=0.27, rely=0.01, relwidth=0.46, relheight=0.98)
frame_start = Frame(frame_main, bg='#191919')
frame_start.place(relx=0.1, rely=0.14, relheight=0.06, relwidth=0.21)
otoentry = Entry(frame_main, font='Square 11 bold', width=20, bd=0, bg='#505050')
otoentry.place(relx=0.06, rely=0.04)
yazi = Label(frame_main, text='Start button is (F4)', bg='#191919', fg='#ffffff')
yazi.place(relx=0.08, rely=0.18)
def yazi():
    geting = otoentry.get()
    pyautogui.typewrite(geting, interval=0.0000001)
def key_listener():
    while True:
        if keyboard.is_pressed('f4'):
            yazi()
listener = threading.Thread(target=key_listener)
listener.start()
master.mainloop()

Python:
def key_listener():
    while True:
        if keyboard.is_pressed('f4'):
            yazi()
listener = threading.Thread(target=key_listener)
listener.start()
Yazdığım programda bu kısım çok fazla CPU tüketilmesine neden oluyor, bu kısıma alternatif olarak ne yapabilirim? Yapmak istediğim şey ise "F4" tuşuna basılınca kodların tetiklenmesi.
"while True:" kısmını değiştirsek olur gibi sanki.
 
Son düzenleme:
Ne yapması gerektiğini çok güzel anlatmışsınız. Magic numberlar da çok yardımcı oluyor.

Halkımızın arayüz fetişine hayranım. 2 satırı bir araya getiremez ama buton görüp tıklayacak. tkinter kullanmadığım ve kullanmayacağım için çalıştırıp sonucu görüp size bir şey diyemeyeceğim.
Koddaki tonla yanlış kullanıma değinmeyeceğim. Ama yazi isimli bir değişken ve fonksiyon olması aptallığına değinmeden edemeyeceğim. Soyadı diye bir şey niye var hiç düşündünüz mü?

"while True:" kısmını değiştirsek olur gibi sanki.
Yok canım, olur mu öyle şey? Çalışmadığı şekliyle çalışmasını bekleyip duralım.

Anladığım kadarıyla kutucuğa büyülü sözler yazıp f4'e basınca o büyülü sözleri ışık hızında yazdırmak istiyorsunuz.

Farklı şeyler yazabileceğiniz için try-except gerekiyor muhtemelen. O olmadan da denersiniz.

Kod:
from pynput import keyboard
from tkinter import *
import pyautogui


def yazi_olmamasi_gereken_ama_niyeyse_yazi_olan_yazi():
    geting = otoentry.get()
    pyautogui.typewrite(geting, interval=0.0000001)


def on_pressed(key):
    try:
        if key.name == "f4":
            yazi_olmamasi_gereken_ama_niyeyse_yazi_olan_yazi()
    except:
        pass


master = Tk()
master.title('Auto Writer')
icon = PhotoImage(file="Adsiz.png")
master.iconphoto(False, icon)
canvas = Canvas(master, height=200, width=400, bg='#000000')
canvas.pack()
master.resizable(width="FALSE", height="FALSE")
frame_sol = Frame(master, bg='#191919')
frame_sol.place(relx=0.01, rely=0.01, relwidth=0.25, relheight=0.98)
frame_sag = Frame(master, bg='#191919')
frame_sag.place(relx=0.74, rely=0.01, relwidth=0.25, relheight=0.98)
frame_main = Frame(master, bg='#191919')
frame_main.place(relx=0.27, rely=0.01, relwidth=0.46, relheight=0.98)
frame_start = Frame(frame_main, bg='#191919')
frame_start.place(relx=0.1, rely=0.14, relheight=0.06, relwidth=0.21)
otoentry = Entry(frame_main, font='Square 11 bold', width=20, bd=0, bg='#505050')
otoentry.place(relx=0.06, rely=0.04)
yazi = Label(frame_main, text='Start button is (F4)', bg='#191919', fg='#ffffff')
yazi.place(relx=0.08, rely=0.18)

listener = keyboard.Listener(on_press=on_pressed)
listener.start()

master.mainloop()
 
Çözüm
Ne yapması gerektiğini çok güzel anlatmışsınız. Magic numberlar da çok yardımcı oluyor.

Halkımızın arayüz fetişine hayranım. 2 satırı bir araya getiremez ama buton görüp tıklayacak. tkinter kullanmadığım ve kullanmayacağım için çalıştırıp sonucu görüp size bir şey diyemeyeceğim.
Koddaki tonla yanlış kullanıma değinmeyeceğim. Ama yazi isimli bir değişken ve fonksiyon olması aptallığına değinmeden edemeyeceğim. Soyadı diye bir şey niye var hiç düşündünüz mü?


Yok canım, olur mu öyle şey? Çalışmadığı şekliyle çalışmasını bekleyip duralım.

Anladığım kadarıyla kutucuğa büyülü sözler yazıp f4'e basınca o büyülü sözleri ışık hızında yazdırmak istiyorsunuz.

Farklı şeyler yazabileceğiniz için try-except gerekiyor muhtemelen. O olmadan da denersiniz.

Kod:
from pynput import keyboard
from tkinter import *
import pyautogui


def yazi_olmamasi_gereken_ama_niyeyse_yazi_olan_yazi():
    geting = otoentry.get()
    pyautogui.typewrite(geting, interval=0.0000001)


def on_pressed(key):
    try:
        if key.name == "f4":
            yazi_olmamasi_gereken_ama_niyeyse_yazi_olan_yazi()
    except:
        pass


master = Tk()
master.title('Auto Writer')
icon = PhotoImage(file="Adsiz.png")
master.iconphoto(False, icon)
canvas = Canvas(master, height=200, width=400, bg='#000000')
canvas.pack()
master.resizable(width="FALSE", height="FALSE")
frame_sol = Frame(master, bg='#191919')
frame_sol.place(relx=0.01, rely=0.01, relwidth=0.25, relheight=0.98)
frame_sag = Frame(master, bg='#191919')
frame_sag.place(relx=0.74, rely=0.01, relwidth=0.25, relheight=0.98)
frame_main = Frame(master, bg='#191919')
frame_main.place(relx=0.27, rely=0.01, relwidth=0.46, relheight=0.98)
frame_start = Frame(frame_main, bg='#191919')
frame_start.place(relx=0.1, rely=0.14, relheight=0.06, relwidth=0.21)
otoentry = Entry(frame_main, font='Square 11 bold', width=20, bd=0, bg='#505050')
otoentry.place(relx=0.06, rely=0.04)
yazi = Label(frame_main, text='Start button is (F4)', bg='#191919', fg='#ffffff')
yazi.place(relx=0.08, rely=0.18)

listener = keyboard.Listener(on_press=on_pressed)
listener.start()

master.mainloop()
Reis çok saol. Sorunum çözüldü, şu yazi mavzusu ise "yazılacak yazi" felan işte öylesine dümenden koymuştum.
 

Technopat Haberler

Geri
Yukarı