Práce s bufferem – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Práce s bufferem – C / C++ – Fórum – Programujte.comPráce s bufferem – C / C++ – Fórum – Programujte.com

 

Meph0
Newbie
12. 6. 2013   #1
-
0
-

Ahoj,

mám dotaz ohledne práci s buffery v C. Potřeboval bych navést na způsob jakým bych mohl z jedné funkce volat jinou, která by například ukládala data z internetového streamu a ukládala je do bufferu, jakmile by byl plný, vrátil by tyto data hlavní funkci, kde by se zpracovávaly a mezi tím se nahrávaly další.

Stahování dat je pořešeno a ukládá se do soudoru, avšak já bych je chtěl ukládat do paměti a pracovat s nimi od jinud. Tuším že asi funkci pro stahování bych měl volat ve vlastním vláknu, ale nevím jak zjistit, že byl již buffer naplněn a mohu s ním pracovat. Jestli mě někdo pochopil, můžete mi prosím poradit :)

Další dotaz bych měl, zda je možné nějakým způsobem dostat pointer do funkce, aniž bych ho s ním volal? třeba někam do souboru uloži adresu paměti a pak ji načíst jinde z toho souboru? Asi to bude blbost, že?

Díky.

Nahlásit jako SPAM
IP: 195.113.241.–
Grungy0
Super člen
13. 6. 2013   #2
-
0
-

Ak ti jedno vlákno čaká kým bude buffer plný a druhé ho plní, tak môžeš použiť nejaký synchronizačný prostriedok. V tomto prípade bude asi najlepší Event http://msdn.microsoft.com/en-us/library/windows/desktop/ms682655%28v=vs.85%29.aspx. Vytvoríš si premennú typu Event na ktorú musia vidieť obe vlákna. Potom v čakajúcom vlákne zavoláš metódu WaitForSingleObject (http://msdn.microsoft.com/en-us/library/windows/desktop/ms687032%28v=vs.85%29.aspx), čím dosiahneš, že vlákno bude čakať, pokiaľ mu iné vlákno nepošle signál, v tvojom prípade o tom, že buffer je plný. Potom musíš zaistiť, že to druhé vlákno, ktoré ti ten buffer plní zavolá metódu SetEvent (http://msdn.microsoft.com/en-us/library/windows/desktop/ms686211%28v=vs.85%29.aspx) keď už bude buffer plný, čím pošle ten spomínaný signál.

Je to trocha zložitejšie na pochopenie, ale pri troche snahy sa to dá zvládnuť, len treba študovať dokumentáciu.

Nahlásit jako SPAM
IP: 188.123.100.–
Prvý náznak hlúposti, je pocit geniality.
Meph0
Newbie
17. 6. 2013   #3
-
0
-

#2 Grungy
Díky, ale tohle je pomocí nějakého windows api pro C++, že? Já bych to potřeboval pomocí čístého C.

Nahlásit jako SPAM
IP: 78.80.152.–
Seph
~ Anonymní uživatel
37 příspěvků
17. 6. 2013   #4
-
0
-

C nebo C++ je to fuk...

Zasláno z mobilního telefonu.

Nahlásit jako SPAM
IP: 80.250.14.–
Meph0
Newbie
17. 6. 2013   #5
-
0
-

#4 Seph
A jde to použít i pod linuxem?

Nahlásit jako SPAM
IP: 195.113.241.–
17. 6. 2013   #6
-
0
-

API jakéhokoliv OS je specifické.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Meph0
Newbie
17. 6. 2013   #7
-
0
-

Jasný, toho jsem se obával, a jak by to tedy bylo možné udělat pod linuxem? Já bych asi volal jedno vlákno s pointerem, kde bych třeba po uložení dat "někam" uložil do místa kam ukazuje pointer číslo 1 a v jiném vlákně neustále testoval, zda je v daném místě paměti uloženo 1, pokud ano, tak to něco udělá. Ale asi to nebude plně vhodné.

Nahlásit jako SPAM
IP: 195.113.241.–
crazy
~ Moderátor
+10
Grafoman
17. 6. 2013   #8
-
0
-

#7 Meph
na synchronizaci se používají mutexy/semafory/podmíněné proměnné/bariéry. Myslím, že použít podmíněnou proměnou by v tomto případě bylo nejvhodnější. A nebo, když se ti naplní buffer, tak zvednou hodnotu semaforu, zpracovat buffer, snížit hodnotu semaforu.

Nahlásit jako SPAM
IP: 147.32.31.–
All you need is vision and time.
Meph0
Newbie
17. 6. 2013   #9
-
0
-

#8 crazy
Super, díky. Našel jsem si k tomu něco a zkusil to přes ty podmíněné proměnné. V jednoduchém projektu mi to funguje, ale když jsem to zahrnul do stávajícího tak už ne. Žádna chyba, jen to nic nedělá. 

proměnné:

pthread_cond_t thread_flag_cv;
pthread_mutex_t thread_flag_mutex;

si předávám mezi vlákny pomocí pointru na struct. a pak je používám například takto:

pthread_mutex_lock(&data->thread_flag_mutex); 
data->flag_save = 1;
printf("flag_save: %d \n",data->flag_save);
pthread_cond_signal(&data->thread_flag_cv);
pthread_mutex_unlock(&data->thread_flag_mutex);

v jiném vkláknu to pak detekuji takto:

while(1) {
	  printf("start: %d\n ",data->flag_save);

    pthread_mutex_lock(&data->thread_flag_mutex);
    while(!data->flag_save)
      pthread_cond_wait(&data->thread_flag_cv, &data->thread_flag_mutex);
    pthread_mutex_unlock(&data->thread_flag_mutex);
    
    printf("do work()\n");
}

Problém, že v tom druhém vláknu signál nepřijde. Nevíte co mám blbě?

Nahlásit jako SPAM
IP: 195.113.241.–
Meph0
Newbie
17. 6. 2013   #10
-
0
-

#9 Meph
ještě jsem zapomněl inicializace, doplnil jsem tedy:

pthread_mutex_init(&data->thread_flag_mutex, NULL);
pthread_cond_init(&data->thread_flag_cv, NULL);
data->flag_save = 0;

a stále nic...

Nahlásit jako SPAM
IP: 195.113.241.–
Grungy0
Super člen
17. 6. 2013   #11
-
0
-

Ten signál ti nepríde pretože tam máš uviaznutie, kedže si ten semafor obalil do mutexu, lock je totižto blokujúca operácia, ktorá zabezpečí že iné vlákno sa do tej sekcie nedostane. Tak isto je aj wait blokujúa operácia a nič za volaním wait sa nevykoná pokial mu nepríde signal, čiže ani unlock, takže v druhom vlákne sa ti k vykonaniu operácie signal nikdy program nedostane, kedže mu to nedovolí mutex do ktorého si ho zaobalil(pretože si ho zamkol v prvom vlákne, ale neodomkol). Semafor proste takto nesmieš obaliť do mutexu!

Riešenie: Hlavne z toho kodu vyhod ten mutex. Taktiež ten flag_save je zbytočný. Stačí ti jednoducho zavolať signal a v druhom vlákne čakať pomocou wait a pôjde to.

Nahlásit jako SPAM
IP: 85.163.198.–
Prvý náznak hlúposti, je pocit geniality.
nergal+1
Návštěvník
17. 6. 2013   #12
-
0
-

#11 Grungy
pthread_cond_wait robí to že uvoľní mutex a čaká na signál z podmienkovej premenej keď ho dostane tak lockne mutex a pokračuje sa vo vykonávaní threadu. (zjednodušene)

prístup do kritickej sekcie musí byť ošetrený mutexami alebo semafórmi preto to vyzerá správne. otázka je či v momente vykonávania týcho vlákien mutex a podmienková premenná ešte existujú, teda či neboli z hlavného vlákna uvoľnené ak sú na stacku alebo niečo podobné...

Nahlásit jako SPAM
IP: 85.135.149.–
viem že neviem čo viem
Meph0
Newbie
18. 6. 2013   #13
-
0
-

#12 nergal


#10 Meph

To já právě nevím. Na začátku programu vytvořím strukturu, která obsahuje thread_flag_mutex a thread_flag_cv, a pak přenáším pointer na tuto strukturu celým programem. mam tam i promenou buffer_size, kde jsem načetl nějakou hodnotu a v druhém vlákně ji vypisuju, ale vypisuje pořád jenom nulovou hodnotu. tak bude asi problém v tom, jen nevim jak to otestovat a vyřešit.

Nahlásit jako SPAM
IP: 78.80.152.–
Meph0
Newbie
18. 6. 2013   #14
-
0
-

Zdravím,

tak vše je vyřešeno, problém byl v předávané struktuře. Měl jsem tam dvakrát po sobě alokaci této struktury, takže se mi původní struktura ztratila. Děkuji za rady a kod nahoře s mutexama funguje správně :) (zatím)

Nahlásit jako SPAM
IP: 78.80.152.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 83 hostů

Podobná vlákna

Prace — založil Anonymní uživatel

Práce ve VB — založil Ata2

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý