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í
×
eParkomat, startup z ČR, postoupil mezi finalisty evropského akcelerátoru ChallengeUp!
Robot na pivo mu otevřel dveře k opravdovému byznysu
Internet věcí: Propojený svět? Už se to blíží...
včera 16:24 | Nová verze

Byla vydána Mageia 5.1. Jedná se o první opravné vydání verze 5, jež vyšla v červnu loňského roku (zprávička). Uživatelům verze 5 nepřináší opravné vydání nic nového, samozřejmě pokud pravidelně aktualizují. Vydání obsahuje všechny aktualizace za posledního téměř půldruhého roku. Mageia 5.1 obsahuje LibreOffice 4.4.7, Linux 4.4.32, KDE4 4.14.5 nebo GNOME 3.14.3.

Ladislav Hagara | Komentářů: 0
včera 13:42 | Pozvánky

V Praze probíhá konference Internet a Technologie 16.2, volné pokračování jarní konference sdružení CZ.NIC. Konferenci lze sledovat online na YouTube. K dispozici je také archiv předchozích konferencí.

Ladislav Hagara | Komentářů: 0
2.12. 22:44 | Komunita

Joinup informuje, že Mnichov používá open source groupware Kolab. V srpnu byl dokončen dvouletý přechod na toto řešení. V provozu je asi 60 000 poštovních schránek. Nejenom Kolabu se věnoval Georg Greve ve své přednášce Open Source: the future for the European institutions (SlideShare) na konferenci DIGITEC 2016, jež proběhla v úterý 29. listopadu v Bruselu. Videozáznam přednášek z hlavního sálu je ke zhlédnutí na Livestreamu.

Ladislav Hagara | Komentářů: 16
2.12. 15:30 | Zajímavý projekt

Společnost Jolla oznámila v příspěvku Case study: Sailfish Watch na svém blogu, že naportovala Sailfish OS na chytré hodinky. Využila a inspirovala se otevřeným operačním systémem pro chytré hodinky AsteroidOS. Použita je knihovna libhybris. Ukázka ovládání hodinek na YouTube.

Ladislav Hagara | Komentářů: 8
2.12. 14:15 | Nová verze

Byla vydána verze 7.1.0 skriptovacího jazyka PHP používaného zejména k vývoji dynamických webových stránek. Jedná se o první stabilní verzi nejnovější větvě 7.1. Přehled novinek v dokumentaci. Podrobnosti v ChangeLogu. K dispozici je také příručka pro přechod z PHP 7.0.x na PHP 7.1.x.

Ladislav Hagara | Komentářů: 2
2.12. 12:55 | Nová verze

Google Chrome 55 byl prohlášen za stabilní. Nejnovější stabilní verze 55.0.2883.75 tohoto webového prohlížeče přináší řadu oprav a vylepšení (YouTube). Opraveno bylo také 36 bezpečnostních chyb. Mariusz Mlynski si například vydělal 22 500 dolarů za 3 nahlášené chyby (Universal XSS in Blink).

Ladislav Hagara | Komentářů: 4
2.12. 11:55 | Pozvánky

Máte rádi svobodný software a hardware nebo se o nich chcete něco dozvědět? Přijďte na 135. sraz spolku OpenAlt, který se bude konat ve čtvrtek 8. prosince od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Sraz bude tentokrát tématický. Bude retro! K vidění budou přístroje jako Psion 5mx nebo Palm Z22. Ze svobodného hardwaru pak Openmoko nebo čtečka WikiReader. Přijďte se i vy pochlubit svými legendami, nebo alespoň na pivo. Moderní hardware má vstup samozřejmě také povolen.

xkucf03 | Komentářů: 0
2.12. 00:10 | Nová verze

Byla vydána verze 3.2 svobodného systému pro detekci a prevenci průniků a monitorování bezpečnosti počítačových sítí Suricata. Z novinek lze zmínit například podporu protokolů DNP3 a CIP/ENIP, vylepšenou podporu TLS a samozřejmě také aktualizovanou dokumentaci.

Ladislav Hagara | Komentářů: 0
1.12. 21:00 | Nová verze

Byla vydána beta verze Linux Mintu 18.1 s kódovým jménem Serena. Na blogu Linux Mintu jsou hned dvě oznámení. První o vydání Linux Mintu s prostředím MATE a druhé o vydání Linux Mintu s prostředím Cinnamon. Stejným způsobem jsou rozděleny také poznámky k vydání (MATE, Cinnamon) a přehled novinek s náhledy (MATE, Cinnamon). Linux Mint 18.1 bude podporován až do roku 2021.

Ladislav Hagara | Komentářů: 0
1.12. 16:42 | Nová verze

Byl vydán Devuan Jessie 1.0 Beta 2. Jedná se o druhou beta verzi forku Debianu bez systemd představeného v listopadu 2014 (zprávička). První beta verze byla vydána v dubnu letošního roku (zprávička). Jedna z posledních přednášek věnovaných Devuanu proběhla v listopadu na konferenci FSCONS 2016 (YouTube, pdf).

Ladislav Hagara | Komentářů: 0
Kolik máte dat ve svém domovském adresáři na svém primárním osobním počítači?
 (32%)
 (24%)
 (29%)
 (7%)
 (5%)
 (3%)
Celkem 767 hlasů
 Komentářů: 50, poslední 29.11. 15:50
Rozcestník
Reklama

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: 187×
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.