Registrace nového uživatele     Návod     Kluby     Archív  Lopuchu     Lopuch.cz  

Něco navíc v zeleném?
A proč ne...

Lopuch.cz

Jméno:
Heslo:
Podpora LCD:
 
Archiv klubu C, C++ [ŽP: neomezená] (kategorie Programování) moderuje Šéf Lopuchu.

Články

Jak bezpečně ukončit vlákno z DllMain
FastAllocPool - urychlení častých alokací a dealokací
Akce a zpráva jako objekt
Tuply v C++
Efektivní alokátor malých objektů a tady druhý a třetí díl
Šablony: Být vládce kvalifikátorů
Vracíme z funkce objekty
Základy komunikace mezi procesy (ve Windows)
Multiple Interface a Instance Factory
Multithreading v C++ (ve Win32)
  Nastavení klubu     Nastavení práv     Homepage     Anketa     Přítomní     Oblíbené     Lopuch     Kategorie  
autor: 
text: 
vyplnit a 
Help
   
[ 280 ] <Novější  <<<Nejnovější  Nejstarší>>>  Starší>  
kdokoliv Kdokoliv Nevidím důvod dělat cokoliv bezdůvodně. - http://kkl2401.wz.cz 8.2.2005 12:38  282
Bredy: Tak tos hledal fakt spatne. Thredy jsou, semafory jsou, zpravy jsou. Mrkni sem. Kdyz projdes ty Beranovy slidy, tak tam tohle vsechno je (a rada dalsiho). Plus u nej najdes i tunu examplu jako treba implementace problemu obedvajicich filozofu tak nebo onak (aspon myslim, ze to tam bylo).
bredy 8.2.2005 12:33  281
KdokolivNo já jsem se pídil po nějakých knihovnách na thready, semafory, message queue, pro linux, abych si udělal nějaký obrázek, jak navrhnou aplikace které bych třeba v budoucnu chtěl provozvat i v linuxu. Ale buď jsem špatně hledal, a nenašel nic, nebo našel co stránka to jiný programový balík, jiná syntaxe, často něco ve stylu "toto si nainstalujte a budete mít message queues". Je něco "standardního"?
kdokoliv Kdokoliv Nevidím důvod dělat cokoliv bezdůvodně. - http://kkl2401.wz.cz 8.2.2005 11:57  280
Ja myslim, ze thready se v Linuxu pouzivaji uplne bezne - novej proces typicky budu poustet ve chvili, kdy chci pustit uplne jinej program (cizi) a treba nejak manipolovat s jeho vstupem nebo vystupem. Kdyz chci pustit kus svyho kodu, tak na to asi nebudu delat novej proces, ale jenom spustim vlakno.
mpts mpts Je to jinak, ba přesně naopak! 8.2.2005 10:59  279
Pod Uni*y obecně se dává přednost forku (dceřinným procesům) před thready, nicméně thready jsou implementovány v linuxu docela dobře už dost dlouhou dobu. Ale vzhledem k tomu, že náklady na nový proces jsou v linuxu velice nízké, má forkování svoje kouzlo.
bredy 8.2.2005 02:22  278
KdokolivBylo by zajímavé nahlédnout jak to mají implementovaný. Totiž jediné řešení které mě napadá (vlastně dvojí). První je, že fork implementuje zaváděcí modul, který při forku spustí process znovu s tím, že si od něj volaný proces převezme komplet celou paměť a všechny otevřené handly (což nemusí být tak hrozné jak se zdá) a skočí na místo, kde se forkuje. Druhé řešení je prostřednictvím DLL a mapování paměti prvního procesu do druhého s nastaveným příznakem COPYONWRITE (dělá se kopie paměti až při zápisu). Myslím, ale že by DLL nestačilo, byla by potřeba nějaka podpora strany OS. A Windows nic takového nemá.

PS: Zajímá mne to proto, že jsem s tím poprvé setkal až na škole, jinak odkojen WinAPI. Hlavně že tím řešili spoustu věcí. No a zase mě ovšem překvapilo, že slovo thread nikdo neznal. Nevím, jak je to teď v linuxu.
kdokoliv Kdokoliv Nevidím důvod dělat cokoliv bezdůvodně. - http://kkl2401.wz.cz 7.2.2005 22:53  277
Bredy: OK, nebudu se hadat, nemam to ted jak overit. Ale mel jsem ten dojem, ze se to bud pod cygwinem a/nebo pod djgpp dalo rozbehat.
bredy 7.2.2005 22:38  276
KdokolivMám pocit, že zrovna fork nelze nijak ve windows implementovat. Já ho teda v žádné Win C neviděl implementován.
kdokoliv Kdokoliv Nevidím důvod dělat cokoliv bezdůvodně. - http://kkl2401.wz.cz 7.2.2005 22:33  275
Bredy: Mne je jedno, jakym zpusobem muj proces kdo vytvoril (stejne tak se muzu forknout a zavolat exec, gcccko mi to prelozi, aspon mam ten dojem). Mne jde o to, jestli si prectu to, s cim me nekdo zavolal (napriklad z prikazove radky) a jestli je to jednoznacne.
bredy 7.2.2005 22:18  274
KdokolivJá myslím, že nejdůležitější v tomto ohledu je tenhle příkaz - Prakticky jediný příkaz ve windows, který spouští jiný process, ať už paralelně nebo sekvenčně (to je jen otázka toho, zda na něj volající process čeká nebo ne)
kdokoliv Kdokoliv Nevidím důvod dělat cokoliv bezdůvodně. - http://kkl2401.wz.cz 7.2.2005 21:24  273
Bredy: Vsak jo, ja taky na Windows bash pouzivam, jenom jsem se chtel dozvedet, co ta jedna promenna obsahuje (a argumentoval jsem, proc kdyz by obsahovala to a to, to je spatne). Dozvedel jsem se, ze se clovek furt dostane ke klasickym argc a argv, coz me uklidnilo.
bredy 7.2.2005 21:12  272
KdokolivMimochodem, pokud se ti nelíbí windowsácký shell, určitě už někoho napadlo přeložit Bash nebo jiný shell pro windows. Windowsácky shell je jen běžná aplikace, která se jmenuje CMD, přejmenovaný COMMAND.COM. Její funkcí je kromě spouštění aplikací ještě spouštění dávek, základních příkazů a umí to i roury (i když stále prastarým způsobem přes temp souboru - protože to asi ještě nikdo nepřepsal do windows).
bredy 7.2.2005 21:09  271
AL3XJen malou poznámku, máš tam chybu:
p+(4*sizeof(char)) ukazuje na páty znak, pokud je to char. Ale obecně páta pozice je p+4. Protože překladač sám vynásobí to číslo velikosti typu. Takže to bude fungovat i s int.

a nezapomeň na veledůležitou věc
free(p) uvolní přidělenou paměť, když už jí člověk nepotřebuje, kde p je to co se získalo mallocem.
Paměť se musí při nepotřebě uvolňovat, jak v C tak v C++. (narozdíl od C# a Javy).
al3x 7.2.2005 20:46  270
Trofo:
- string je pole znaku
- ukazatel ti vetsinou ukazuje na prvni znak z toho stringu, presneji receno: hodnota ukazatele je adresa v pameti, kde se nachazi prvni znak
- kdyz chces cist druhej znak, tak se musis kouknout na sousedni pozici.
- kdyz chces precist ten to misto v pameti, na ktery ti miri ukazatel 'p', tak to najdes v *p
- kdyz p ukazuje na prvni znak, tak p+(sizeof(char)) ukazuje na druhy. analogicky p+(4*sizeof(char)) ukazuje na paty.
- pouziva se zkraceny zapis p[0] (pro prvni znak), p[n] pro n+1 znak
- 'a = (int) b' se pokusi preves hodnotu 'b' na typ int a priradit do 'a'.
- 'p = (char*) k' se pokusi prevest 'k' na typ "ukazatel na char" a priradit do 'p'
- 'malloc(sizeof(char) * 10)' ti uvolni v pameti misto na 10 znaku a vrati pointer na prvni znich
- 'p = (char*) malloc(sizeof(char) * 10)' ti v pameti uvolni misto na 10 znaku a adresu prvniho ti priradi do 'p', pricemz se explicitne uvadi, ze se prirazuje ukazatel na char. (malloc vraci jen obecny ukazatele a je treba je pretypovat)

To jsou v rychlosti zaklady prace s ukazately. Snad tam nemam moc chyb. :)
kdokoliv Kdokoliv Nevidím důvod dělat cokoliv bezdůvodně. - http://kkl2401.wz.cz 7.2.2005 20:33  269
Trofozoit: Ano, bylo Ti doporuceno hledat stesti jinde, protoze jinde bys za ty tri dny mozna uz mela funkcni celej ten programek. :-) Proste C (a uz vubec ne C++) se neda naucit ani snadno, ani rychle, proc myslis, ze je to jeden z jazyku, ktery se na informatickych skolach skutecne uci (a relativne dlouho), zatimco u mnohych ostatnich se kolikrat predpoklada, ze uz si to student nejak zjisti sam? :-)

pString = (char *) GlobalLock(hGlobal); je skutecne prirazeni adresy. Volas tam funkci GlobalLock, ktera bere jeden parametr (nejakeho typu, to zpameti nevim a listovat se mi nechce) a vraci hodnotu typu ukazatel (na nejakou adresu). Nejspis vraci hodnotu typu void * (cili obecny ukazatel, tj. ukazatel, u ktereho neni receno, na co ukazuje), procez je nutne (resp. vhodne, mozna ze by to prekladac zkousl i bez toho, ale neni bezpecne zvyknout si tak programovat) pretypovat to na typ ukazatel na char, tedy char *, ponevadz pString je typu ukazatel na char.
Ano, s tridou String se pracuje urcite o neco lepe, jenom je dobre vedet, ze se tim presouvas od C k C++ (to jen tak na okraj). String sice mozna nepujde tak uplne primo nacpat do clipboardu, ale na ziskani klasickeho C retezce ze Stringu tam stoprocentne je nejaka trivialni metoda (zpameti nevim, v C++ aktivne neprogramuju), cili ji akorat v jednom miste zavolas a ona vrati prave ukazatel na char, tedy char *.
Mimochodem ad posledni zavorka - ukazatel vzdycky ukazuje na jedinou vec - napriklad retezec je ukazatel na jediny znak - na prvni znak retezce, dostat se ke kazdemu dalsim znaku je snadne - je to vzdy ten nasledujici v pameti, poznat konec retezce je taky snadne, jednou v pameti narazis na znak s kodem 0, tak ten uz do toho retezce nepatri.
trofozoit Trofozoit DNA, DNA - come out and play 7.2.2005 20:22  268
Kdokoliv: Ale bylo mi nenápadně doporučeno hledat štěstí jinde ;) To není moc hezký na to že se ho učím teprve asi tři dny ;) Ale to je jedno..

ad tvůj příklad, ano chápu jak se deklarují proměnné různými způsoby,
pochopím co dělá int * pointer; pokud bude někde dál taky pointer = &neco;, ale bez toho druhého řádku je to pořád jen deklarace a přiřazování nevidím, jak psal Bredy, poiter musí někam ukazovat.. jediný další řádek kde se pString objevuje je pString = (char *) GlobalLock(hGlobal); což se klidně přiznám, že pokud je přiřazení adresy tohle, tak bych to nepoznala.

Jinak protože budu potřebovat pracovat s řetězci, zkoušela jsem si o nich něco najít, většinou se s nimi líp pracuje jako třídou string, ale předpokládám, že tahle "nástavba" se zase nedá nacpat do toho clipboardu "jen tak", přecejen vyžaduje detailnější práci s pamětí, takže (hádám..)je pravděpodobnost se tam bude přesouvat spíš v původním céčkovém (bez plusek) zápisu řetězců, který nápadně vypadá jako onen char * neco; (ve skutečnosti by to taky měl být ukazatel na sekvenci znaků). Vyplývá z toho opravdu to co si myslím nebo ne? :)

[ 280 ] <Novější  <<<Nejnovější  Nejstarší>>>  Starší>  

(c) 2001-2011 Lopuch.cz   
Kontakt