Thready pod widlema – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Thready pod widlema – C / C++ – Fórum – Programujte.comThready pod widlema – C / C++ – Fórum – Programujte.com

 

Dusan Knop0
Newbie
16. 5. 2007   #1
-
0
-

Ahoj mam taky problemek, delam cosik do skoly a vypoustim tam vlakna. Ve windows to delam pomoci _beginthread(), ale nejak jsem tu nenasel zadnou funkci, ktera by se podobala linuxovemu pthread_join(). Nevit o necem?
DIk

Nahlásit jako SPAM
IP: ...–
zacatecnik0
Super člen
16. 5. 2007   #2
-
0
-

popiste nam co dela

pthread_join()
takhle ste zuzil moznou odpoved jen na lidi co znaji tuto fci v pythonu a zaroven znaji win 32 api

Nahlásit jako SPAM
IP: ...–
Můj blog http://www.zacatecnik.wu.cz[br]Překládám anglickou knihu o wxWidgets http://wxwidgets.hustej.net
Dusan Knop0
Newbie
16. 5. 2007   #3
-
0
-

pthread_join() je Ceckovska funkce pod linuxem z knihovny <pthread.h> zpusobuje cekani na konkretni vlakno, nez dokonci svuj kod - tedy se mapriklad neukonci main dokud se nodokonci vlakna...
A take bych potreboval vedet, jak z vlakna vymlatit jeho navratovou hodnotu.

Nahlásit jako SPAM
IP: ...–
zacatecnik0
Super člen
16. 5. 2007   #4
-
0
-

zkuste si projit tento kod od Petzolda:

/*---------------------------------------

MULTI1.C -- Demonstrace multitaskingu
(c) Charles Petzold, 1998
---------------------------------------*/

#include <windows.h>
#include <math.h>

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

int cyChar ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("Multi1") ;
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;

wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ;

if (!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT ("Program vyžaduje Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}

hwnd = CreateWindow (szAppName, TEXT ("Demonstrace multitaskingu"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL) ;

ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;

while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}

int CheckBottom (HWND hwnd, int cyClient, int iLine)
{
if (iLine * cyChar + cyChar > cyClient)
{
InvalidateRect (hwnd, NULL, TRUE) ;
UpdateWindow (hwnd) ;
iLine = 0 ;
}
return iLine ;
}

// ---------------------------------------------
// Okno 1: Zobrazení rostoucí posloupnosti čísel
// ---------------------------------------------

LRESULT APIENTRY WndProc1 (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static int iNum, iLine, cyClient ;
HDC hdc ;
TCHAR szBuffer[16] ;

switch (message)
{
case WM_SIZE:
cyClient = HIWORD (lParam) ;
return 0 ;

case WM_TIMER:
if (iNum < 0)
iNum = 0 ;

iLine = CheckBottom (hwnd, cyClient, iLine) ;
hdc = GetDC (hwnd) ;

TextOut (hdc, 0, iLine * cyChar, szBuffer,
wsprintf (szBuffer, TEXT ("%d"), iNum++)) ;

ReleaseDC (hwnd, hdc) ;
iLine++ ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}

// -------------------------------------------------
// Okno 2: Zobrazení rostoucí posloupnosti prvočísel
// -------------------------------------------------

LRESULT APIENTRY WndProc2 (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static int iNum = 1, iLine, cyClient ;
HDC hdc ;
int i, iSqrt ;
TCHAR szBuffer[16] ;

switch (message)
{
case WM_SIZE:
cyClient = HIWORD (lParam) ;
return 0 ;

case WM_TIMER:
do {
if (++iNum < 0)
iNum = 0 ;

iSqrt = (int) sqrt (iNum) ;

for (i = 2 ; i <= iSqrt ; i++)
if (iNum % i == 0)
break ;
}
while (i <= iSqrt) ;

iLine = CheckBottom (hwnd, cyClient, iLine) ;
hdc = GetDC (hwnd) ;

TextOut (hdc, 0, iLine * cyChar, szBuffer,
wsprintf (szBuffer, TEXT ("%d"), iNum)) ;

ReleaseDC (hwnd, hdc) ;
iLine++ ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}

// ------------------------------------------
// Okno 3: Zobrazení Fibonacciho posloupnosti
// ------------------------------------------

LRESULT APIENTRY WndProc3 (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static int iNum = 0, iNext = 1, iLine, cyClient ;
HDC hdc ;
int iTemp ;
TCHAR szBuffer[16] ;

switch (message)
{
case WM_SIZE:
cyClient = HIWORD (lParam) ;
return 0 ;

case WM_TIMER:
if (iNum < 0)
{
iNum = 0 ;
iNext = 1 ;
}

iLine = CheckBottom (hwnd, cyClient, iLine) ;
hdc = GetDC (hwnd) ;

TextOut (hdc, 0, iLine * cyChar, szBuffer,
wsprintf (szBuffer, TEXT ("%d"), iNum)) ;

ReleaseDC (hwnd, hdc) ;
iTemp = iNum ;
iNum = iNext ;
iNext += iTemp ;
iLine++ ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}

// ----------------------------------------------
// Okno 4: Zobrazení kružnic s náhodným poloměrem
// ----------------------------------------------

LRESULT APIENTRY WndProc4 (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static int cxClient, cyClient ;
HDC hdc ;
int iDiameter ;

switch (message)
{
case WM_SIZE:
cxClient = LOWORD (lParam) ;
cyClient = HIWORD (lParam) ;
return 0 ;

case WM_TIMER:
InvalidateRect (hwnd, NULL, TRUE) ;
UpdateWindow (hwnd) ;

iDiameter = rand() % (max (1, min (cxClient, cyClient))) ;
hdc = GetDC (hwnd) ;

Ellipse (hdc, (cxClient - iDiameter) / 2,
(cyClient - iDiameter) / 2,
(cxClient + iDiameter) / 2,
(cyClient + iDiameter) / 2) ;

ReleaseDC (hwnd, hdc) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}

// ------------------------------------
// Hlavní okno vytvářející dceřiná okna
// ------------------------------------

LRESULT APIENTRY WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HWND hwndChild[4] ;
static TCHAR * szChildClass[] = { TEXT ("Child1"), TEXT ("Child2"),
TEXT ("Child3"), TEXT ("Child4") } ;
static WNDPROC ChildProc[] = { WndProc1, WndProc2, WndProc3, WndProc4 } ;
HINSTANCE hInstance ;
int i, cxClient, cyClient ;
WNDCLASS wndclass ;

switch (message)
{
case WM_CREATE:
hInstance = (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE) ;

wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = NULL ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;

for (i = 0 ; i < 4 ; i++)
{
wndclass.lpfnWndProc = ChildProc[i] ;
wndclass.lpszClassName = szChildClass[i] ;

RegisterClass (&wndclass) ;

hwndChild[i] = CreateWindow (szChildClass[i], NULL,
WS_CHILDWINDOW | WS_BORDER | WS_VISIBLE,
0, 0, 0, 0,
hwnd, (HMENU) i, hInstance, NULL) ;
}

cyChar = HIWORD (GetDialogBaseUnits ()) ;
SetTimer (hwnd, 1, 10, NULL) ;
return 0 ;

case WM_SIZE:
cxClient = LOWORD (lParam) ;
cyClient = HIWORD (lParam) ;

for (i = 0 ; i < 4 ; i++)
MoveWindow (hwndChild[i], (i % 2) * cxClient / 2,
(i > 1) * cyClient / 2,
cxClient / 2, cyClient / 2, TRUE) ;
return 0 ;

case WM_TIMER:
for (i = 0 ; i < 4 ; i++)
SendMessage (hwndChild[i], WM_TIMER, wParam, lParam) ;

return 0 ;

case WM_CHAR:
if (wParam == '\x1B')
DestroyWindow (hwnd) ;

return 0 ;

case WM_DESTROY:
KillTimer (hwnd, 1) ;
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}


Nahlásit jako SPAM
IP: ...–
Můj blog http://www.zacatecnik.wu.cz[br]Překládám anglickou knihu o wxWidgets http://wxwidgets.hustej.net
zacatecnik0
Super člen
16. 5. 2007   #5
-
0
-

nebo kod 2:

/*---------------------------------------

MULTI2.C -- Demonstrace multitaskingu
(c) Charles Petzold, 1998
---------------------------------------*/

#include <windows.h>
#include <math.h>
#include <process.h>

typedef struct
{
HWND hwnd ;
int cxClient ;
int cyClient ;
int cyChar ;
BOOL bKill ;
}
PARAMS, *PPARAMS ;

LRESULT APIENTRY WndProc (HWND, UINT, WPARAM, LPARAM) ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("Multi2") ;
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;

wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ;

if (!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT ("Program vyžaduje Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}

hwnd = CreateWindow (szAppName, TEXT ("Demonstrace multitaskingu"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL) ;

ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;

while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}

int CheckBottom (HWND hwnd, int cyClient, int cyChar, int iLine)
{
if (iLine * cyChar + cyChar > cyClient)
{
InvalidateRect (hwnd, NULL, TRUE) ;
UpdateWindow (hwnd) ;
iLine = 0 ;
}
return iLine ;
}

// ---------------------------------------------
// Okno 1: Zobrazení rostoucí posloupnosti čísel
// ---------------------------------------------

void Thread1 (PVOID pvoid)
{
HDC hdc ;
int iNum = 0, iLine = 0 ;
PPARAMS pparams ;
TCHAR szBuffer[16] ;

pparams = (PPARAMS) pvoid ;

while (!pparams->bKill)
{
if (iNum < 0)
iNum = 0 ;

iLine = CheckBottom (pparams->hwnd, pparams->cyClient,
pparams->cyChar, iLine) ;

hdc = GetDC (pparams->hwnd) ;

TextOut (hdc, 0, iLine * pparams->cyChar, szBuffer,
wsprintf (szBuffer, TEXT ("%d"), iNum++)) ;

ReleaseDC (pparams->hwnd, hdc) ;
iLine++ ;
}
_endthread () ;
}

LRESULT APIENTRY WndProc1 (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static PARAMS params ;

switch (message)
{
case WM_CREATE:
params.hwnd = hwnd ;
params.cyChar = HIWORD (GetDialogBaseUnits ()) ;
_beginthread (Thread1, 0, ¶ms) ;
return 0 ;

case WM_SIZE:
params.cyClient = HIWORD (lParam) ;
return 0 ;

case WM_DESTROY:
params.bKill = TRUE ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}

// -------------------------------------------------
// Okno 2: Zobrazení rostoucí posloupnosti prvočísel
// -------------------------------------------------

void Thread2 (PVOID pvoid)
{
HDC hdc ;
int iNum = 1, iLine = 0, i, iSqrt ;
PPARAMS pparams ;
TCHAR szBuffer[16] ;

pparams = (PPARAMS) pvoid ;

while (!pparams->bKill)
{
do
{
if (++iNum < 0)
iNum = 0 ;

iSqrt = (int) sqrt (iNum) ;

for (i = 2 ; i <= iSqrt ; i++)
if (iNum % i == 0)
break ;
}
while (i <= iSqrt) ;

iLine = CheckBottom (pparams->hwnd, pparams->cyClient,
pparams->cyChar, iLine) ;

hdc = GetDC (pparams->hwnd) ;

TextOut (hdc, 0, iLine * pparams->cyChar, szBuffer,
wsprintf (szBuffer, TEXT ("%d"), iNum)) ;

ReleaseDC (pparams->hwnd, hdc) ;
iLine++ ;
}
_endthread () ;
}

LRESULT APIENTRY WndProc2 (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static PARAMS params ;

switch (message)
{
case WM_CREATE:
params.hwnd = hwnd ;
params.cyChar = HIWORD (GetDialogBaseUnits ()) ;
_beginthread (Thread2, 0, ¶ms) ;
return 0 ;

case WM_SIZE:
params.cyClient = HIWORD (lParam) ;
return 0 ;

case WM_DESTROY:
params.bKill = TRUE ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}

// ------------------------------------------
// Okno 3: Zobrazení Fibonacciho posloupnosti
// ------------------------------------------

void Thread3 (PVOID pvoid)
{
HDC hdc ;
int iNum = 0, iNext = 1, iLine = 0, iTemp ;
PPARAMS pparams ;
TCHAR szBuffer[16] ;

pparams = (PPARAMS) pvoid ;

while (!pparams->bKill)
{
if (iNum < 0)
{
iNum = 0 ;
iNext = 1 ;
}
iLine = CheckBottom (pparams->hwnd, pparams->cyClient,
pparams->cyChar, iLine) ;

hdc = GetDC (pparams->hwnd) ;

TextOut (hdc, 0, iLine * pparams->cyChar, szBuffer,
wsprintf (szBuffer, TEXT ("%d"), iNum)) ;

ReleaseDC (pparams->hwnd, hdc) ;
iTemp = iNum ;
iNum = iNext ;
iNext += iTemp ;
iLine++ ;
}
_endthread () ;
}

LRESULT APIENTRY WndProc3 (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static PARAMS params ;

switch (message)
{
case WM_CREATE:
params.hwnd = hwnd ;
params.cyChar = HIWORD (GetDialogBaseUnits ()) ;
_beginthread (Thread3, 0, ¶ms) ;
return 0 ;

case WM_SIZE:
params.cyClient = HIWORD (lParam) ;
return 0 ;

case WM_DESTROY:
params.bKill = TRUE ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}

// ----------------------------------------------
// Okno 4: Zobrazení kružnic s náhodným poloměrem
// ----------------------------------------------

void Thread4 (PVOID pvoid)
{
HDC hdc ;
int iDiameter ;
PPARAMS pparams ;

pparams = (PPARAMS) pvoid ;

while (!pparams->bKill)
{
InvalidateRect (pparams->hwnd, NULL, TRUE) ;
UpdateWindow (pparams->hwnd) ;

iDiameter = rand() % (max (1,
min (pparams->cxClient, pparams->cyClient))) ;

hdc = GetDC (pparams->hwnd) ;

Ellipse (hdc, (pparams->cxClient - iDiameter) / 2,
(pparams->cyClient - iDiameter) / 2,
(pparams->cxClient + iDiameter) / 2,
(pparams->cyClient + iDiameter) / 2) ;

ReleaseDC (pparams->hwnd, hdc) ;
}
_endthread () ;
}

LRESULT APIENTRY WndProc4 (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static PARAMS params ;

switch (message)
{
case WM_CREATE:
params.hwnd = hwnd ;
params.cyChar = HIWORD (GetDialogBaseUnits ()) ;
_beginthread (Thread4, 0, ¶ms) ;
return 0 ;

case WM_SIZE:
params.cxClient = LOWORD (lParam) ;
params.cyClient = HIWORD (lParam) ;
return 0 ;

case WM_DESTROY:
params.bKill = TRUE ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}

// ------------------------------------
// Hlavní okno vytvářející dceřiná okna
// ------------------------------------

LRESULT APIENTRY WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HWND hwndChild[4] ;
static TCHAR * szChildClass[] = { TEXT ("Child1"), TEXT ("Child2"),
TEXT ("Child3"), TEXT ("Child4") } ;
static WNDPROC ChildProc[] = { WndProc1, WndProc2, WndProc3, WndProc4 } ;
HINSTANCE hInstance ;
int i, cxClient, cyClient ;
WNDCLASS wndclass ;

switch (message)
{
case WM_CREATE:
hInstance = (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE) ;

wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = NULL ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;

for (i = 0 ; i < 4 ; i++)
{
wndclass.lpfnWndProc = ChildProc[i] ;
wndclass.lpszClassName = szChildClass[i] ;

RegisterClass (&wndclass) ;

hwndChild[i] = CreateWindow (szChildClass[i], NULL,
WS_CHILDWINDOW | WS_BORDER | WS_VISIBLE,
0, 0, 0, 0,
hwnd, (HMENU) i, hInstance, NULL) ;
}

return 0 ;

case WM_SIZE:
cxClient = LOWORD (lParam) ;
cyClient = HIWORD (lParam) ;

for (i = 0 ; i < 4 ; i++)
MoveWindow (hwndChild[i], (i % 2) * cxClient / 2,
(i > 1) * cyClient / 2,
cxClient / 2, cyClient / 2, TRUE) ;
return 0 ;

case WM_CHAR:
if (wParam == '\x1B')
DestroyWindow (hwnd) ;

return 0 ;

case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}

Nahlásit jako SPAM
IP: ...–
Můj blog http://www.zacatecnik.wu.cz[br]Překládám anglickou knihu o wxWidgets http://wxwidgets.hustej.net
sn3d0
Věrný člen
17. 5. 2007   #6
-
0
-

Vlakna vo Win su pomerne dost odlisne od POSIX vlakien pthread. Inac tento problem sa da vyriesit trosku inac. Funkciou CreateThread si vytvoris vlakno, dostanes handle vlakna. Existuje funkcia GetExitCodeThread() ktora vracia navratovu hodnotu vlakna. Ak vlakno nebolo ukoncene , tak vrati STILL_ACTIVE. Ak budes tuto funkciu volat v nejakom loope, tak dostanes vlastne funkcionalitu pthread_join().

Pre _beginthread som zazrel riesenie:



#include <windows.h>
#include <stdio.h>
#include <process.h>

unsigned Counter;
unsigned __stdcall SecondThreadFunc( void* pArguments )
{
printf( "In second thread...\n" );

while ( Counter < 1000000 )
Counter++;

_endthreadex( 0 );
return 0;
}

int main()
{
HANDLE hThread;
unsigned threadID;

printf( "Creating second thread...\n" );

// Create the second thread.
hThread = (HANDLE)_beginthreadex( NULL, 0, &SecondThreadFunc, NULL, 0, &threadID );

// Wait until second thread terminates.
WaitForSingleObject( hThread, INFINITE );
printf( "Counter should be 1000000; it is-> %d\n", Counter );
// Destroy the thread object.
CloseHandle( hThread );
}

Nahlásit jako SPAM
IP: ...–
shutdown -h now
zacatecnik0
Super člen
17. 5. 2007   #7
-
0
-

prosim Vas sn3d nevzpomiante si kde jste tento priklad nasel? Rad bych se tam podival jestli tam nepisou nejake dodatecne inforamce, protoze kod tak jak je uvedeny mi nefunguje, hlasi to:

error C2065: '_endthreadex' : undeclared identifier

error C2065: '_beginthreadex' : undeclared identifier
warning C4508: 'main' : function should return a value; 'void' return type assumed

return 0; jsem doplnil ale co s ostatnim netusim protoze nevim proc to neche brat kdyz _beginthreadex je v process.h, nevite?


edit: omlouvam se za takovou zacatecnickou chybu:
#if !defined(_MT)

#error _beginthreadex requires a multithreaded C run-time library.
#endif

je jasne ze jsem nemel zapnuty multi thread v nastaveni

nashle

Nahlásit jako SPAM
IP: ...–
Můj blog http://www.zacatecnik.wu.cz[br]Překládám anglickou knihu o wxWidgets http://wxwidgets.hustej.net
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, 60 hostů

Podobná vlákna

Thready — založil Šťouchal

C / C++ pod Windowsom — založil qdMbp

C++ pod linuxom — založil janik366

Pisne pod ap — založil bortak

C++ pod linuxom — založil Grungy

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ý