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 22:11 | Pozvánky

    Dětem začala škola a nedobrovolně se tak musí vzdělávat. Avšak pro dospělé, kteří se chtějí vzdělávat nebo naopak se o vědomosti podělit, je tu Virtuální Bastlírna - jako každý měsíc si můžete online a zdarma nezávazně popovídat o vědě a technice nejen s bastlíři, ale i s vývojáři, vědci nebo profesory. A čemu se strahováci budou věnovat? Blíží se KiCAD 11 s nespočtem novinek, z nichž zde musí zmínit alespoň možnost kótování a závislostí z

    … více »
    bkralik | Komentářů: 0
    včera 19:33 | Komunita

    Asahi Linux, tj. Linux pro Apple Silicon, oficiálně podporuje čipy M3 (M3, M3 Pro a M3 Max).

    Ladislav Hagara | Komentářů: 1
    včera 15:44 | IT novinky Ladislav Hagara | Komentářů: 0
    včera 15:00 | IT novinky

    Server SiFive BigSky SF-2U870 2U je založený na jádře SiFive P870-D, zatím je naintegrovaných 32 jader 256 GB RAM 2 GHz, škálovat lze do 256 jader na čip. O něco podrobnější popis serveru v článku SiFive BigSky Ships the First RISC-V Server. Is the GPU Head Node the Prize? na futurumgroup.com. Asi ani tento čip nebude na úrovni nejlepších 64-bit ARMů a AMD Zenů, ale splňuje RVA23 specifikaci a je podporovaný Ubuntu 26.04 LTS a RHEL 10. V článku je

    … více »
    Pavel Píša | Komentářů: 1
    včera 00:11 | IT novinky

    Na YouTube lze zhlédnout nový celovečerní dokumentární film The Story of VS Code | Official Documentary věnovaný Visual Studio Code.

    Ladislav Hagara | Komentářů: 14
    4.9. 23:49 | Zajímavý článek

    Farid Abdelnour se v příspěvku na blogu rozepsal o novinkám v nejnovější verzi 26.08.0 editoru videa Kdenlive (Wikipedie). Ke stažení také na Flathubu.

    Ladislav Hagara | Komentářů: 1
    4.9. 17:33 | Zajímavý článek

    Bylo vydáno nové číslo hackerského magazínu tmp.0ut: Volume 5.

    Ladislav Hagara | Komentářů: 0
    4.9. 01:44 | Nová verze

    Byla vydána nová stabilní verze 8.2 webového prohlížeče Vivaldi (Wikipedie). Postavena je na Chromiu 152. Přehled novinek i s náhledy v příspěvku na blogu.

    Ladislav Hagara | Komentářů: 0
    3.9. 23:11 | Nová verze

    Byla vydána nová stabilní verze 4.0 svobodného multiplatformního softwaru pro editování a nahrávání zvukových souborů Audacity (Wikipedie). S rozhraním přepsaným do Qt. Přehled novinek také na YouTube. Ke stažení je oficiální AppImage. Zatím starší verze Audacity lze instalovat také z Flathubu a Snapcraftu.

    Ladislav Hagara | Komentářů: 2
    3.9. 16:55 | IT novinky

    NVIDIA kupuje Hugging Face za 12,93 miliardy dolarů.

    Ladislav Hagara | Komentářů: 4
    Které desktopové prostředí na Linuxu používáte?
     (10%)
     (7%)
     (4%)
     (20%)
     (29%)
     (7%)
     (6%)
     (2%)
     (14%)
     (21%)
    Celkem 2595 hlasů
     Komentářů: 31, poslední 13.8. 00:27
    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: 400×
    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.