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íží...
dnes 06:00 | Zajímavý software

OMG! Ubuntu! představuje emulátor terminálu Hyper (GitHub) postavený na webových technologiích (HTML, CSS a JavaScript). V diskusi k článku je zmíněn podobný emulátor terminálu Black Screen. Hyper i Black Screen používají framework Electron, stejně jako editor Atom nebo vývojové prostředí Visual Studio Code.

Ladislav Hagara | Komentářů: 13
dnes 06:00 | Zajímavý článek

I letos vychází řada ajťáckých adventních kalendářů. QEMU Advent Calendar 2016 přináší každý den nový obraz disku pro QEMU. Programátoři se mohou potrápit při řešení úloh z kalendáře Advent of Code 2016. Kalendáře Perl Advent Calendar 2016 a Perl 6 Advent Calendar přinášejí každý den zajímavé informace o programovacím jazyce Perl. Stranou nezůstává ani programovací jazyk Go.

Ladislav Hagara | Komentářů: 4
3.12. 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ářů: 11
3.12. 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ářů: 25
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ářů: 10
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ářů: 4
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ářů: 1
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
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 773 hlasů
 Komentářů: 50, poslední 29.11. 15:50
Rozcestník
Reklama

Dotaz: C++ pthread a trida - problem s vytvorenim vlakna

29.11.2008 16:17 Tomáš Skočdopole | skóre: 13
C++ pthread a trida - problem s vytvorenim vlakna
Přečteno: 2102×

Ahoj,

v souvislosti s diskuzi Metody pristupu na seriovy port v C jsem se rozhodl resit to pres vlakna. Chtel jsem to udelat tak, ze by kazda instance tridy vytvorila dve vlakna - jedno pro RX, druhe pro TX.

Bohuzel jsem narazil na problem nevim jak vytvorit vlakno, ktere se vytvori s "main" funkci, ktera je metodou dane tridy: 

Udelal jsem jednoduchy example:

trida.h

#ifndef _TRIDA_H_
#define _TRIDA_H_

#include <iostream>
#include <pthread.h>

using namespace std;

class my_class
{
    public:
    my_class(void);
  
    private:
    void* my_thread_main(void*);
  
    pthread_t my_thread_tid;
};


#endif // _TRIDA_H_

 

trida.cpp


#include "trida.h"

my_class::my_class (void)
{
    cout << "Hello from my_class!";
  
    pthread_create(&(this->my_thread_tid),
                   NULL,
                   &(this->my_thread_main),
                   NULL);

    return;
}

my_class::~my_class (void)
{
    /* pthread_join() */
  
    return;
}

void * my_class::my_thread_main (void *) {
  
    cout << "Hello from my_thread_main!";
  
    return(0);
}

test.cpp


#include <iostream>
#include "trida.h"

using namespace std;

int main (int argc, char **argv)
{
    my_class example;
  
    cout << "Hello from main!\n";
  
    return (0);
}

 

Pri prekladu dostanu toto:

g++ -c trida.cpp -o trida.o
trida.cpp: In constructor ‘my_class::my_class()’:
trida.cpp:9: error: ISO C++ forbids taking the address of a bound member function to form a pointer to member function.  Say ‘&my_class::my_thread_main’
trida.cpp:10: error: cannot convert ‘void* (my_class::*)(void*)’ to ‘void* (*)(void*)’ for argument ‘3’ to ‘int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)’
trida.cpp: At global scope:
trida.cpp:15: error: definition of implicitly-declared ‘my_class::~my_class()’
make: *** [trida.o] Error 1

 

Dekuji vsem za pomoc! Tomas

Odpovědi

Bluebear avatar 29.11.2008 16:28 Bluebear | skóre: 30 | blog: Bluebearův samožerblog | Praha
Rozbalit Rozbalit vše Re: C++ pthread a trida - problem s vytvorenim vlakna

V prvé řadě: IMHO není vůbec dobrý nápad dělat komunikaci přes port tak, že jedno vlákno posílá a druhé přijímá. Možná se mýlím, ale myslím, že to bude strašný bordel.

Metodu třídy my_main() máš deklarovanou jako metodu třídy my_class. Volání pthread_create() očekává ukazatel na funkci, ale ty se snažíš mu předat metodu třídy - to nemůžeš udělat, protože metoda třídy očekává navíc ukazatel na "this", který jí nemáš jak předat.

Fungovalo by to, kdyby byla metoda my_main() deklarována jako statická, a ukazatel na příslušný objekt my_class bys jí předával explicitně; potom můžeš tento ukazatel předat jako "uživatelská data" skrz volání pthread_create() a vymalováno.

To mi připomíná, jak jsem si pořídil květináč, že v něm budu mít květinu. Opravdu tam byla, ale potom být přestala...
Bluebear avatar 29.11.2008 16:34 Bluebear | skóre: 30 | blog: Bluebearův samožerblog | Praha
Rozbalit Rozbalit vše Re: C++ pthread a trida - problem s vytvorenim vlakna

Jo: zkus se inspirovat nějakou už hotovou C++ knihovnou.

Jako příklad se mrkni třeba na to, jak je udělaná třída QThread z Qt. Není to nijak těžké, jen je třeba udělat ten taneček okolo předávání pointeru na objekt.

To mi připomíná, jak jsem si pořídil květináč, že v něm budu mít květinu. Opravdu tam byla, ale potom být přestala...
29.11.2008 17:10 Tomáš Skočdopole | skóre: 13
Rozbalit Rozbalit vše Re: C++ pthread a trida - problem s vytvorenim vlakna

No ale jak lze tedy efektivne resit pristup k portu? Kdyz select nelze pouzit protoze chci behem prijimani a odesilani delat neco jineho a ne cekat na data od portu.

Potrebuji totiz soubezne zpracovani dat na seriovem portu a provadeni jineho kodu.

Pokud by ale byla metoda staticka, tak to by znamenalo, ze by vsechny instance tridy meli tuto metodu spolecnou.

Ale ja bych chtel aby kazdy seriovy port mel sve dve vlakna.

Josef Kufner avatar 30.11.2008 03:51 Josef Kufner | skóre: 66
Rozbalit Rozbalit vše Re: C++ pthread a trida - problem s vytvorenim vlakna
select() má timeout (poslední parametr) a ten může být nulový (nikoliv nullový).
Hello world ! Segmentation fault (core dumped)
ava avatar 30.11.2008 14:46 ava | skóre: 10
Rozbalit Rozbalit vše Re: C++ pthread a trida - problem s vytvorenim vlakna

Napis co vlastne potrebujes udelat (co ma ta aplikace delat kdyz se zrovna nepristupuje k seriaku), a myslim ze by bylo dobre zamyslet se nad tim jestli by to neslo resit jen s jednim vlaknem a neblokujicim ctenim, ve vetsine pripadu to jde a je to lepsi reseni nez s pomoci vlaken.

Press any key to continue, or any other key to cancel
Josef Kufner avatar 30.11.2008 04:03 Josef Kufner | skóre: 66
Rozbalit Rozbalit vše Re: C++ pthread a trida - problem s vytvorenim vlakna
Koukni se na mého krtečka... Byla to mimojiné i semestrálka z x36osy na téma "Chceme vlákna a chceme jich mooooooooc.". Zejména tě budou zajímat soubory thread.(cc|h) -- obsahují třídu, kterou si zdědíš, implementuješ main() a už jen vyrábíš co instance, to vlákno. Ale pozor, ty vlákna se s tím vyrábějí až nebezpečně lehce, tak se nezamotej :-D

... btw, nechce ovládání krtka někdo naportovat do tuxánků nebo zatacky? Mohlo by pak u jednoho počítače hrát několik dalších hráčů -- používali by jeden mikrofon a tůůůů, hůůůů, tůůůůůůů, pííííísk.
Hello world ! Segmentation fault (core dumped)
30.11.2008 10:04 vencas | skóre: 32
Rozbalit Rozbalit vše Re: C++ pthread a trida - problem s vytvorenim vlakna

Pripojuji se v tom smyslu, že dělat vlákna přes pthreads je v c++ zbytečná dřina. Osobně bych doporučil www.boost.org/doc/html/thread.html .

Luboš Doležel (Doli) avatar 30.11.2008 13:07 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
Rozbalit Rozbalit vše Re: C++ pthread a trida - problem s vytvorenim vlakna
Zapojovat Boost (který zas jen zavolá pthreads) do jednoduchého programu mi zase přijde overkill.
elviin avatar 30.11.2008 21:08 elviin | skóre: 29 | blog: elviin | Plzeň-Praha
Rozbalit Rozbalit vše Re: C++ pthread a trida - problem s vytvorenim vlakna

Pokud bude delat jen jeden programek v C++ tak je to overkill, pokud se tim bude dlouhodobe zabejvat, tak boost je jasna volba.

30.11.2008 22:34 vencas | skóre: 32
Rozbalit Rozbalit vše Re: C++ pthread a trida - problem s vytvorenim vlakna

Přibere tím závislost navíc, ale co se týče čitelnosti kódu (a přenositelnosti, ale to je v tomto případě asi jedno), tak tím myslím získá.

8.12.2008 12:14 Deleted [8409] | skóre: 14 | blog: darkblog
Rozbalit Rozbalit vše Re: C++ pthread a trida - problem s vytvorenim vlakna
Potřebujete to jen obalit do statické funkce, něco takového:
#ifndef _TRIDA_H_
#define _TRIDA_H_

#include <iostream>
#include <pthread.h>

using namespace std;

class my_class
{
public:
    my_class(void);
  
private:
    static void* _entry(void*);
    void* main();
  
    pthread_t _id;
};


#endif // _TRIDA_H_

my_class::my_class (void)
{
    cout << "Hello from my_class!";
  
    pthread_create(&(this->_id), NULL, &_entry, NULL);

    return;
}

my_class::~my_class (void)
{
    /* pthread_join() */
  
    return;
}

void* my_class::_entry (void* data)
{
  my_class* thread = (my_class*)data;
  return thread->main();
}

void *my_class::main()
{
    cout << "Hello from my_thread_main!";
  
    return(0);
}

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.