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í
×
dnes 11:55 | Komunita

Vývojový tým OpenSSL ve spolupráci s iniciativou Core Infrastructure konsorcia Linux Foundation spustil proces přelicencování této kryptografické knihovny ze současné licence na licenci Apache Licence v 2.0 (ASLv2). Nová licence usnadní začleňování OpenSSL do dalších svobodných a open source projektů. Všichni dosavadní vývojáři OpenSSL (Authors) obdrží v následujících dnech email s prosbou o souhlas se změnou licence.

Ladislav Hagara | Komentářů: 1
dnes 01:11 | Komunita

Před třemi týdny Mozilla.cz představila projekt Photon, jehož cílem je návrh a implementace nového vzhledu Firefoxu. Včera zveřejnila první náhled vzhledu Photon. Práce na projektu Photon jsou rozděleny do pěti týmů, které celkem čítají 19 lidí. Zaměřují se na zlepšení prvního spuštění Firefoxu a zaujetí nových uživatelů, celkovou úpravu vzhledu, zlepšení animací, zrychlení odezvy uživatelského rozhraní a také upravení nabídek. Vývoj lze sledovat v Bugzille.

Ladislav Hagara | Komentářů: 9
včera 20:00 | Komunita

OneDrive pro firmy je již ve webových prohlížečích na Linuxu stejně rychlý jako na Windows. Microsoft opravil chybu z listopadu loňského roku. OneDrive pro firmy běžel na Linuxu mnohem pomaleji než na Windows. V popisu chyby bylo uvedeno, že stačilo v prohlížeči na Linuxu nastavit v user-agentu Windows a vše se zrychlilo. Odpovědí Microsoftu bylo (Internet Archive: Wayback Machine), že Linux není podporován. Po bouřlivých diskusích na redditu i Hacker News byla chyba nalezena a opravena.

Ladislav Hagara | Komentářů: 4
včera 19:00 | Zajímavý projekt

Byla vyhlášena soutěž Hackaday Prize 2017. Soutěž je určena vývojářům open source hardwaru. Pro výherce je připraveno celkově 250 tisíc dolarů. Každý ze 120 finalistů získá tisíc dolarů. Nejlepší pak navíc 50, 30, 20, 15, 10 a 5 tisíc dolarů. Jedná se již o čtvrtý ročník soutěže. V roce 2014 zvítězil projekt globální sítě open source pozemních satelitních stanic SatNOGS. V roce 2015 zvítězil open source systém pro řízení elektrických invalidních vozíků pohybem očí Eyedriveomatic. V roce 2016 zvítězil modulární robot Dtto.

Ladislav Hagara | Komentářů: 0
včera 15:00 | Bezpečnostní upozornění

Byla vydána Samba ve verzích 4.6.1, 4.5.7 a 4.4.12. Řešen je bezpečnostní problém CVE-2017-2619. Pomocí symbolických odkazů a souběhu (symlink race) lze "teoreticky" získat přístup k souborům, které nejsou sdíleny. Linuxové distribuce jsou postupně aktualizovány (Debian).

Ladislav Hagara | Komentářů: 0
včera 07:43 | Nová verze

Na Steamu se objevil port hry Arma: Cold War Assault (Operation Flashpoint) pro Mac a Linux. … více »

creon | Komentářů: 26
včera 05:55 | Nová verze

Po 18 měsících od vydání verze 8.0 byla vydána verze 9.0 open source alternativy GitHubu, tj. softwarového nástroje s webovým rozhraním umožňujícího spolupráci na zdrojových kódech, GitLab. Představení nových vlastností v příspěvku na blogu a na YouTube.

Ladislav Hagara | Komentářů: 0
včera 03:33 | Komunita

Platnost posledního patentu souvisejícího s Dolby Digital (AC-3) vypršela. Po MP3 se tak do Fedory oficiálně dostane také kodek AC-3.

Ladislav Hagara | Komentářů: 5
včera 00:44 | Komunita

Feral Interactive, společnost zabývající se vydáváním počítačových her pro operační systémy macOS a Linux, nabízí své hry na Steamu vývojářům open source 3D grafické knihovny Mesa zdarma. Podmínkou je minimálně 25 commitů za posledních 5 let. Stejnou nabídku dostali vývojáři knihovny Mesa v roce 2015 od Valve. O rok dříve dostali od Valve tuto nabídku vývojáři Debianu a Ubuntu.

Ladislav Hagara | Komentářů: 0
22.3. 23:55 | Nová verze

Opera 44, verze 44.0.2510.857, byla prohlášena za stabilní. Nejnovější verze tohoto webového prohlížeče je postavena na Chromiu 57. Z novinek vývojáři Opery zdůrazňují podporou Touch Baru na nejnovějších MacBoocích Pro (gif). Přehled novinek pro vývojáře na blogu Dev.Opera.

Ladislav Hagara | Komentářů: 1
Jak se stavíte k trendu ztenčování přenosných zařízení (smartphony, notebooky)?
 (14%)
 (2%)
 (72%)
 (3%)
 (10%)
Celkem 924 hlasů
 Komentářů: 72, poslední 1.3. 11:16
    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: 191×
    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.