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í
×
    28.11. 18:55 | Humor

    Jak na webu co nejšíleněji zadávat datum? Jak to uživatelům co nejvíce znepříjemnit? V Bad UX World Cup 2025 (YouTube) se vybíraly ty nejšílenější UX návrhy. Vítězným návrhem se stal Perfect Date.

    Ladislav Hagara | Komentářů: 9
    28.11. 12:44 | Zajímavý software

    Společnost Collabora vydala (YouTube) na LibreOffice založený desktopový kancelářský balík Collabora Office. Pro Windows, macOS a Linux. Se stejným uživatelským rozhraním jako Collabora Online. Svůj desktopový kancelářský balík s rozhraním LibreOffice pojmenovala Collabora Office Classic.

    Ladislav Hagara | Komentářů: 7
    28.11. 12:00 | Nová verze

    Glen MacArthur vydal AV Linux (AVL) a MX Moksha (MXM) 25. S linuxovým jádrem Liquorix. AV Linux (Wikipedie) je linuxová distribuce optimalizována pro tvůrce audio a video obsahu. Nejnovější AV Linux vychází z MX Linuxu 25 a Debianu 13 Trixie. AV Linux přichází s desktopovým prostředím Enlightenment 0.27.1 a MX Moksha s prostředím Moksha 0.4.1 (fork Enlightenmentu).

    Ladislav Hagara | Komentářů: 0
    27.11. 17:55 | Nová verze

    Ubuntu pro testování nových verzí vydává měsíční snapshoty. Dnes vyšel 1. snapshot Ubuntu 26.04 LTS (Resolute Raccoon).

    Ladislav Hagara | Komentářů: 0
    27.11. 14:33 | IT novinky

    Zástupci členských států EU se včera shodli na návrhu, který má bojovat proti šíření materiálů na internetu zobrazujících sexuální zneužívání dětí. Nařízení známé pod zkratkou CSAM a přezdívané chat control mělo množství kritiků a dlouho nebyla pro jeho schválení dostatečná podpora. Pro schválení byla potřeba kvalifikovaná většina a dánské předsednictví v Radě EU se snažilo dosáhnout kompromisu. Návrh nakonec po dlouhých týdnech

    … více »
    Ladislav Hagara | Komentářů: 13
    27.11. 12:22 | Zajímavý software

    Britské herní studio Facepunch stojící za počítačovými hrami Garry's Mod a Rust uvolnilo svůj herní engine s&box (Wikipedie) jako open source. Zdrojové kódy jsou k dispozici na GitHubu pod licencí MIT. Herní engine s&box je postavený nad proprietárním herním enginem Source 2 od společnosti Valve.

    Ladislav Hagara | Komentářů: 1
    27.11. 04:55 | Komunita

    Vývoj programovacího jazyka Zig byl přesunut z GitHubu na Codeberg. Sponzoring na Every.

    Ladislav Hagara | Komentářů: 7
    27.11. 04:44 | Komunita

    Stejně jako GNOME i KDE Plasma končí s X11. KDE Plasma 6.8 poběží už pouze nad Waylandem. Aplikace pro X11 budou využívat XWayland.

    Ladislav Hagara | Komentářů: 3
    26.11. 14:55 | IT novinky

    Poslanci Evropského parlamentu dnes vyzvali k výraznému zvýšení ochrany nezletilých na internetu, včetně zákazu vstupu na sociální sítě pro osoby mladší 16 let. Legislativně nezávazná zpráva, kterou dnes odsouhlasil Evropský parlament poměrem 493 hlasů pro ku 92 proti, kromě zavedení věkové hranice 16 let pro využívání sociálních sítí, platforem pro sdílení videí či společníků s umělou inteligencí (AI) vyzývá také k zákazu … více »

    Ladislav Hagara | Komentářů: 58
    26.11. 14:11 | Humor

    Doom v KiCadu nebo na osciloskopu? Žádný problém: KiDoom: Running DOOM on PCB Traces a ScopeDoom: DOOM on an Oscilloscope via Sound Card.

    Ladislav Hagara | Komentářů: 3
    Jaké řešení používáte k vývoji / práci?
     (34%)
     (47%)
     (19%)
     (18%)
     (23%)
     (16%)
     (24%)
     (16%)
     (18%)
    Celkem 418 hlasů
     Komentářů: 17, poslední 19.11. 21:57
    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: 236×
    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: 71 | 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.