abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 22:22 | IT novinky

    Na základě DMCA požadavku bylo na konci dubna z GitHubu odstraněno 8535 repozitářů se zdrojovými kódy open source emulátoru přenosné herní konzole Nintendo Switch yuzu.

    Ladislav Hagara | Komentářů: 0
    dnes 00:33 | Nová verze

    Webový prohlížeč Dillo (Wikipedie) byl vydán ve verzi 3.1.0. Po devíti letech od vydání předchozí verze 3.0.5. Doména dillo.org již nepatří vývojářům Dilla.

    Ladislav Hagara | Komentářů: 0
    včera 15:00 | Komunita

    O víkendu probíhá v Bostonu, a také virtuálně, konference LibrePlanet 2024 organizovaná nadací Free Software Foundation (FSF).

    Ladislav Hagara | Komentářů: 0
    včera 13:22 | Nová verze

    Nová vývojová verze Wine 9.8 řeší mimo jiné chybu #3689 při instalaci Microsoft Office 97 nahlášenou v roce 2005.

    Ladislav Hagara | Komentářů: 0
    3.5. 13:11 | Nová verze

    Coppwr, tj. GUI nástroj pro nízkoúrovňové ovládání PipeWire, byl vydán v nové verzi 1.6.0. Zdrojové kódy jsou k dispozici na GitHubu. Instalovat lze také z Flathubu.

    Ladislav Hagara | Komentářů: 0
    2.5. 22:33 | Nová verze

    Byla vydána dubnová aktualizace aneb nová verze 1.89 editoru zdrojových kódů Visual Studio Code (Wikipedie). Přehled novinek i s náhledy a animovanými gify v poznámkách k vydání. Vypíchnout lze, že v terminálu lze nově povolit vkládání kopírovaného textu stisknutím středního tlačítka myši. Ve verzi 1.89 vyjde také VSCodium, tj. komunitní sestavení Visual Studia Code bez telemetrie a licenčních podmínek Microsoftu.

    Ladislav Hagara | Komentářů: 28
    2.5. 21:22 | Nová verze

    Proton, tj. fork Wine integrovaný v Steam Play a umožňující v Linuxu přímo ze Steamu hrát hry určené pouze pro Windows, byl vydán ve verzi 9.0-1 (𝕏). Přehled novinek se seznamem nově podporovaných her na GitHubu. Aktuální přehled her pro Windows běžících díky Protonu také na Linuxu na stránkách ProtonDB.

    Ladislav Hagara | Komentářů: 2
    2.5. 19:33 | Nová verze

    Byla vydána verze 1.78.0 programovacího jazyka Rust (Wikipedie). Podrobnosti v poznámkách k vydání na GitHubu. Vyzkoušet Rust lze například na stránce Rust by Example.

    Ladislav Hagara | Komentářů: 0
    2.5. 11:22 | Bezpečnostní upozornění

    Služba Dropbox Sign (původně HelloSign) pro elektronické podepisování smluv byla hacknuta.

    Ladislav Hagara | Komentářů: 3
    2.5. 11:00 | Nová verze

    Byla vydána nová major verze 8.0 textového editoru GNU nano (Wikipedie). Podrobný přehled novinek a oprav v oznámení v diskusním listu info-nano nebo v souboru ChangeLog na Savannah. Volbou --modernbindings (-/) lze povolit "moderní" klávesové zkratky: ^C kopírování, ^V vložení, ^Z vrácení zpět, … Tato volba je aktivována také pokud binárka s nano nebo link na ni začíná písmenem "e".

    Ladislav Hagara | Komentářů: 4
    Podle hypotézy Mrtvý Internet mj. tvoří většinu online interakcí boti.
     (61%)
     (10%)
     (16%)
     (13%)
    Celkem 93 hlasů
     Komentářů: 8, poslední včera 08:25
    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: 208×
    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.