abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    včera 14:00 | Zajímavý článek

    Byl publikován aktuální přehled vývoje renderovacího jádra webového prohlížeče Servo (Wikipedie).

    Ladislav Hagara | Komentářů: 0
    včera 12:00 | Nová verze

    V programovacím jazyce Go naprogramovaná webová aplikace pro spolupráci na zdrojových kódech pomocí gitu Forgejo byla vydána ve verzi 12.0 (Mastodon). Forgejo je fork Gitei.

    Ladislav Hagara | Komentářů: 0
    17.7. 18:44 | Zajímavý článek

    Nová čísla časopisů od nakladatelství Raspberry Pi zdarma ke čtení: Raspberry Pi Official Magazine 155 (pdf) a Hello World 27 (pdf).

    Ladislav Hagara | Komentářů: 1
    17.7. 16:11 | Nová verze

    Hyprland, tj. kompozitor pro Wayland zaměřený na dláždění okny a zároveň grafické efekty, byl vydán ve verzi 0.50.0. Podrobný přehled novinek na GitHubu.

    Ladislav Hagara | Komentářů: 2
    17.7. 15:55 | Komunita

    Patrick Volkerding oznámil před dvaatřiceti lety vydání Slackware Linuxu 1.00. Slackware Linux byl tenkrát k dispozici na 3,5 palcových disketách. Základní systém byl na 13 disketách. Kdo chtěl grafiku, potřeboval dalších 11 disket. Slackware Linux 1.00 byl postaven na Linuxu .99pl11 Alpha, libc 4.4.1, g++ 2.4.5 a XFree86 1.3.

    Ladislav Hagara | Komentářů: 5
    16.7. 21:22 | IT novinky

    Ministerstvo pro místní rozvoj (MMR) jako první orgán státní správy v Česku spustilo takzvaný „bug bounty“ program pro odhalování bezpečnostních rizik a zranitelných míst ve svých informačních systémech. Za nalezení kritické zranitelnosti nabízí veřejnosti odměnu 1000 eur, v případě vysoké závažnosti je to 500 eur. Program se inspiruje přístupy běžnými v komerčním sektoru nebo ve veřejné sféře v zahraničí.

    Ladislav Hagara | Komentářů: 19
    16.7. 16:22 | IT novinky

    Vláda dne 16. července 2025 schválila návrh nového jednotného vizuálního stylu státní správy. Vytvořilo jej na základě veřejné soutěže studio Najbrt. Náklady na přípravu návrhu a metodiky činily tři miliony korun. Modernizovaný dvouocasý lev vychází z malého státního znaku. Vizuální styl doprovází originální písmo Czechia Sans.

    Ladislav Hagara | Komentářů: 26
    16.7. 15:33 | Upozornění

    Vyhledávač DuckDuckGo je podle webu DownDetector od 2:15 SELČ nedostupný. Opět fungovat začal na několik minut zhruba v 15:15. Další služby nesouvisející přímo s vyhledáváním, jako mapyAI asistent jsou dostupné. Pro některé dotazy během výpadku stále funguje zobrazování například textu z Wikipedie.

    bindiff | Komentářů: 8
    16.7. 13:33 | Bezpečnostní upozornění

    Více než 600 aplikací postavených na PHP frameworku Laravel je zranitelných vůči vzdálenému spuštění libovolného kódu. Útočníci mohou zneužít veřejně uniklé konfigurační klíče APP_KEY (např. z GitHubu). Z více než 260 000 APP_KEY získaných z GitHubu bylo ověřeno, že přes 600 aplikací je zranitelných. Zhruba 63 % úniků pochází z .env souborů, které často obsahují i další citlivé údaje (např. přístupové údaje k databázím nebo cloudovým službám).

    Ladislav Hagara | Komentářů: 5
    16.7. 00:11 | Nová verze

    Open source modální textový editor Helix, inspirovaný editory Vim, Neovim či Kakoune, byl vydán ve verzi 25.07. Přehled novinek se záznamy terminálových sezení v asciinema v oznámení na webu. Detailně v CHANGELOGu na GitHubu.

    Ladislav Hagara | Komentářů: 0
    Jaký je váš oblíbený skriptovací jazyk?
     (59%)
     (27%)
     (7%)
     (3%)
     (0%)
     (1%)
     (4%)
    Celkem 410 hlasů
     Komentářů: 16, poslední 8.6. 21:05
    Rozcestník

    Dotaz: Virtuální metody

    Jardík avatar 23.11.2006 21:48 Jardík | skóre: 40 | blog: jarda_bloguje
    Virtuální metody
    Přečteno: 225×
    Mám problém s voláním virtuálních metody jedné třídy: Thread:
    class Thread{
    private:
    	pthread_t m_tHandle;
    	unsigned int m_nStatus;
    	Mutex m_tMutex;
    public:
    	enum Status{
    		NotRunning = 0,
    		Running = 1,
    		Suspended = 2,
    		Zombie = 3
    	};
    	Thread();
    	virtual ~Thread();
    	void run();
    	void kill();
    	void wait();
    	pthread_t handle() const { return m_tHandle; };
    	void handle( pthread_t handle ) { m_tHandle = handle; }
    	void lock() { m_tMutex.lock(); }
    	void unlock(){ m_tMutex.unlock(); }
    	bool tryLock(){ return m_tMutex.tryLock(); }
    	void status( unsigned int status );
    	unsigned int status() const { return m_nStatus; }
    	virtual void start();
    	virtual void stop();
    	static void waitForAll();
    };
    
    static void *entry_point(void *thread_)
    {
    	Thread* thread = reinterpret_cast<Thread*>(thread_);
    	signal(SIGQUIT, signal_handler_SIGQUIT);
    	thread_list_mutex.lock();
    	thread_list.insert( std::make_pair(pthread_self(), thread) );
    	thread_list_mutex.unlock();
    	thread->handle(pthread_self());
    	thread->start();
    	thread->stop();
    	thread->status(Thread::Zombie);
    	pthread_exit(NULL);
    	return NULL;
    }
    
    void Thread::run()
    {
    	if( status() == NotRunning )
    	{
    	label_create:
    		status(Running);
    		pthread_create(&m_tHandle, NULL, &entry_point, this);
    	}
    	else if( status() == Zombie ){
    		wait();
    		goto label_create;
    	}
    }
    
    Ve funkci static void *entry_point(void *thread_) volám thread->start(). Problém je, že se vždy zavolá metoda start() třídy Thread a né metoda odvozené třídy MujThread:
    class MujThread: public Thread{
    public:
    	MujThread(){}
    	virtual ~MujThread(){}
    	virtual void start()
    	{
    		printf("MujThread start()\n");
    		while(true);
    	}
    	virtual void stop()
    	{
    		printf("MujThread stop()\n");
    	}
    };
    
    Věřím v jednoho Boha.

    Odpovědi

    23.11.2006 22:02 volca
    Rozbalit Rozbalit vše Re: Virtuální metody
    Nejsem si jisty, ale neni na vine reinterpret_cast? nemel by tam byt static_cast?
    23.11.2006 22:29 volca
    Rozbalit Rozbalit vše Re: Virtuální metody
    Jak tak premyslim tak to ani ten static_cast nezachrani. Problem bude asi v tom, ze kastujes z void*, a kompilator se tak nedozvi byvaly typ. Asi to bude chtit nekoho zkusenejsiho, ale muj posledni typ je dynamic_cast (diky RTTI)
    Jardík avatar 23.11.2006 22:59 Jardík | skóre: 40 | blog: jarda_bloguje
    Rozbalit Rozbalit vše Re: Virtuální metody
    Jsem samozřejmě zkoušel také. Zkoušel jsem i (Thread*)thread_, bezúspěšně. Vím ale, že ten kód ještě nedávno fungoval. Pomalu bych řekl, že přestal fungovat po aktualizaci gcc.
    Věřím v jednoho Boha.
    Luboš Doležel (Doli) avatar 23.11.2006 23:15 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
    Rozbalit Rozbalit vše Re: Virtuální metody
    Zkuste udělat tu metodu Thread::start pure virtual, jak se to zachová.
    Jardík avatar 24.11.2006 16:59 Jardík | skóre: 40 | blog: jarda_bloguje
    Rozbalit Rozbalit vše Re: Virtuální metody
    pure virtual method called
    terminate called without an active exception
    ./testutk: line 4:  6543 Neúspěšně ukončen (SIGABRT)
    
    Věřím v jednoho Boha.
    Luboš Doležel (Doli) avatar 24.11.2006 17:04 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
    Rozbalit Rozbalit vše Re: Virtuální metody
    Tohle by se správně nemělo nikdy stát :-)

    Nemáte dohromady ty verze GCC smíchané (že by kus kódu byl zkompilovaný se starou verzí)?
    Jardík avatar 24.11.2006 17:21 Jardík | skóre: 40 | blog: jarda_bloguje
    Rozbalit Rozbalit vše Re: Virtuální metody
    Určitě ne. Před novou kompilací jsem provedl make clean.
    Věřím v jednoho Boha.
    24.11.2006 08:06 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Virtuální metody
    Zkusil bych tu metodu MujThread::start() nedávat jako inline. Kompilátor by sice měl být dost chytrý, aby buď ignoroval evidentní chybu programátora, nebo protestoval, jenže právě to ignorování chyby lze provést dvěma způsoby: buď bude ignorovat virtual nebo inline (zde implicitní). Musel bych se podívat, co v takové situaci předepisuje specifikace jazyka, ale v každém případě bude jistější nepožadovat po překladači něco, co je principiálně nemožné.
    Jardík avatar 24.11.2006 17:15 Jardík | skóre: 40 | blog: jarda_bloguje
    Rozbalit Rozbalit vše Re: Virtuální metody
    I když nedám metodu MujThred::start() jako inline, nefunguje to. Mám jinou třídu (Application):
    class Application{
    	....
    public:
    	....
    	virtual bool onInit() { return true; }
    	virtual void onQuit() {}
    	....
    };
    
    Od té odvozuji TestApplication:
    class TestApplication: public Application{
    protected:
    	MujThread t;
    public:
    	virtual bool onInit()
    	{
    		...
    		t.run();
    		return true;
    	}
    	
    	virtual void onQuit()
    	{
    		t.kill();
    	}
    };
    
    Zde však volání virtuálních metod funguje správně, což popírá vaši domněnku. (Už jste viděl zdrojový kód Qt knihovny? Je tam toho plno.) Problém bude nejspíš jinde. A jak říkám výše, ten kód fungoval naprosto bezchybně, když jsem ho před časem použil (ale na jiné distribuci, s jiným kernelem - 2.6.17, teď 2.6.18 - a s trochu nižší verzí GCC).
    Věřím v jednoho Boha.
    24.11.2006 21:14 Michal Marek (twofish) | skóre: 55 | blog: { display: blog; } | Praha
    Rozbalit Rozbalit vše Re: Virtuální metody
    Hmm, taková hloupá otázka, ale odkud se volá ta metoda entry_point()? Pokud by se volala z konstruktoru Thread, tak by to vysvětlovalo to chování.
    Jardík avatar 24.11.2006 22:33 Jardík | skóre: 40 | blog: jarda_bloguje
    Rozbalit Rozbalit vše Re: Virtuální metody
    Z konstruktoru volána není. Volá se z Thread::run() (viz. kód výše), konkrétně se zavolá po vytvoření nového vlákna: pthread_create(&m_tHandle, NULL, &entry_point, this).
    Věřím v jednoho Boha.

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.