Zdravim,
delal jste nekdo threading v c++ v konzol. aplikaci?
Delam chat pres sockety a je zde potreba threadovat.
Nedelal jste nekdo uz takovy program nebo nevite jak na to?
Diky M.
Printable View
Zdravim,
delal jste nekdo threading v c++ v konzol. aplikaci?
Delam chat pres sockety a je zde potreba threadovat.
Nedelal jste nekdo uz takovy program nebo nevite jak na to?
Diky M.
Na rootu byl nedavno pekny serial o takovychhle vecech - moc podrobne jsem ho necet ale myslim ze to tam bude probrane docela do hloubky.
Jedna se predevsim o glibc pthreads (asi nejpouzivanejsi v soucasnosti). Pripadne muzes pouzivat threadovani v glib (www.gtk.org).
mno delam to pod Win XP s MS Visual studio 6
Tam to je stejne?
MSDN->CreateProcess, CreateThread apod.Citace:
Původně odeslal mudboy
Hm to nevim, pod windowsama neprogramuju. Zalezi jakou potrebujes portabilitu. Glib je tusim taky multiplatformni (POSIX unixy a Windows).Citace:
Původně odeslal mudboy
diky za odpovedi,
thread mi uz jede dobre,
ale jeste mam problem se socketama.
Delam program na chatovani.
takze potrebuji odeslat data a zaroven cekat, jestli neco server neposila.
Nevite, jak to udelat?
Diky
vsechno uz mam vyreseno krome jednoho:
jde v C++ nacist buffer klavesnice?
Potrebuji zjistit, zda neni stisknute tlacitko, aniz by se program zastavoval (t.j. instrukce neni halt, jen projede a kdyztak neco vrati).
Kdysi jsem to delal v ASM zavolanim preruseni.
Diky
Snad by měl fungovat GetAsyncKeyState....
funguje to i v konzolove aplikaci?
To jsem zapomnel napsat
Mělo by...
a nebo zkus něco jako toto...
fce kbhit() by měla být v conio.h..[/code]Kód:if (kbhit()) {
key = getch();
if (key == '1') ....
Tak tohle mi bohuzel nejede,Citace:
Původně odeslal Anduril
prelozi se to, ale v programu to nic nedela
Takže tvůj kompilátor nepodporuje conio...
Tak zkus toto...zkopírováno ze souboru wincompat.h
Tohle mi funguje...gcc (MingW)
Kód:#if !defined(WINCOMPAT_INCLUDED) && !defined(PLATFORM_WINDOWS) && !defined(WIN32) && !defined(WINDOWS) && !defined(__WIN32__)
#define WINCOMPAT_INCLUDED
/**
*
* Author: Magnus Naeslund (mag@fbab.net, mag@bahnhof.se)
* (c) 2000 Magnus Naeslund, all rights reserved
*
*/
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <termios.h>
#include <stdio.h>
#include <stdlib.h>
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
#define _kbhit kbhit
#define stricmp strcasecmp
#define strnicmp strncasecmp
#define Sleep(x) usleep((x)*1000)
static int inited=0;
static struct termios ori;
static void tcatexit(){
tcsetattr(0,0,&ori);
}
static void init_terminal(){
struct termios t;
tcgetattr(0,&t);
tcgetattr(0,&ori);
t.c_lflag &= ~(ICANON);
tcsetattr(0,0,&t);
atexit(tcatexit);
}
static inline int kbhit(){
fd_set rfds;
struct timeval tv;
if (!inited){
inited=1;
init_terminal();
}
FD_ZERO(&rfds);
FD_SET(0, &rfds);
tv.tv_sec = 0;
tv.tv_usec = 10*1000;
return select(1, &rfds, NULL, NULL, &tv)>0;
}
static inline int getch(){
fd_set rfds;
if (!inited){
inited=1;
init_terminal();
}
FD_ZERO(&rfds);
FD_SET(0, &rfds);
if (select(1, &rfds, NULL, NULL, NULL)>0)
return getchar();
else{
printf("wincompat.h: select() on fd 0 failed\n");
return 0xDeadBeef;
}
}
#endif
chjo,
to mi zase vraciCitace:
LIBCMTD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Tak to už máš problém v nastavení svého kompilátoru/linkeru...shlédni MSDN, určitě najdeš řešení...bude to něco s přepínačem /MT a nebo použitím jiné knihovny než libcmtd...třeba zkus msvcrt... ???Citace:
Původně odeslal mudboy
A nebo na to kašli a zkus ten GetAsyncKeyState()...zkoušel jsem to teď v konzoli a funguje...
krátký příklad ;D :
Kód:#include "stdio.h"
#include "windows.h"
int main(int argc, char**argv)
{
while(TRUE)
if(GetAsyncKeyState(VK_ESCAPE) & 0x8000)
break;
}
diky,
samotny tento priklad mi funguje,
ale v mem projektu mama jakmile tam pridamKód:#include <winsock2.h>
#include <iostream>
#include <time.h>
#include <string.h>
tak to hodi 99 erroru a 11 varovani, kvuli tomu, ze nektere fce jsou definovany ve winsock i windows, takze to hlasi redefinition of....Kód:#include "stdio.h"
#include "windows.h"
Da se toto nejak obejit?
Diky moc
Jo..vymaž include <winsock...>, je to automaticky includováno, když zapíšeš include <windows.h>....stdio.h nepotřebuješ, je tam zbytečně;)
EDIT:
A nebo kdyby to nefungovalo, tak zadej
#include <windows.h>
#include <winsock2.h>
to nechapu,
porad to nefunguje,
mam threadovany program, v hlavni fci je for ( ; ; ) {blablabla....GetAsyncKeyState...blablabla
if (konec) break;.....atd}
A proste to ne ESC nereaguje:-(
uz fakt nevim, co s tim, ten tvuj priklad fungoval, ale v mem projektu to potom nejde
EDIT2: data jdou posilat do doby, nez se zmackne escape, ale jakmile se zmackne, tak program zamrzne
No vždyť to sám píšeš...máš threadovaný program...takže program může skončit až skončí všechny thready. Takže když zmáčkneš escape, musíš dát ostatním threadům návěst, že musí skončit a až skončí, tak pak můžeš ukončit program....Citace:
Původně odeslal mudboy