Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C/C++ Сетевое программирование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.05.2010, 16:56   #1
Sam Gold
Форумчанин
 
Аватар для Sam Gold
 
Регистрация: 26.03.2010
Сообщений: 538
Восклицание Поставить CreateThread в нужное место

Добронго времени суток! Когда то написал консольных клиента и сервер. На клиенте было два потока: один считывает сообщение и посылает через сервер другому клиенту, другой принимает сообщения.
Код:
SOCKET client;
SEND=CreateThread(NULL,0,CLIENT_SEND,(void *)&client,0,&ID_SEND);
RECV=CreateThread(NULL,0,CLIENT_RECV,(void *)&client,0,&ID_RECV);
Теперь решил перенести клиента на C++ Bulder. Подскажите пожалуйта, как заставить поток RECV работать, пока приложение не будет закрыто
ПАробовал создавать поток при открытии проиложения в функции __fastcall TForm1::TForm1(TComponent* Owner)

Код:
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{


 //=================открытие сокета==============
	RECV=CreateThread(NULL,0,CLIENT_RECV,(void *)&client,0,0);
}
то принимается только одно сообщение, а если создавать при нажатии кнопки то сообщение вообще не принимается
Функция, принимающая сообщения:
Код:
DWORD  WINAPI CLIENT_RECV(LPVOID param){

	int ex=0;
	while(ex==0){
		   SOCKET client;
		   client=*((SOCKET *)param);

		   char *size_name;
		   size_name=(char *)malloc(10);

		   char *size_mess;
		   size_mess=(char *)malloc(10);

		   recv(client,size_name,10,0);

		   recv(client,size_mess,10,0);


		   int mess_size=atol(size_mess);
		   int name_size=atol(size_name);

		   char  *buf_r;
		   buf_r=(char *)malloc(mess_size);

		   char  *buf_nam;
		   buf_nam=(char *)malloc(name_size);

		   int nam=recv(client,buf_nam,name_size,0);
		   if (nam<0) {
		          ex=1;
		   }



		    int rec_m=recv(client,buf_r,mess_size,0);
		    if(rec_m<0) ex=1;
		    string name(buf_nam);
		    string mess(buf_r);


		   if((nam>0)&&(rec_m>0)){

				Form1->Memo3->Lines->Add("Upload new message ");


				Form1->Memo3->Lines->Add(name);

				Form1->Memo3->Lines->Add(mess);
				Form1->Memo3->Lines->Add("\n");


		  }
		  free(buf_r);
		  free(buf_nam);
		  free(size_name);
		  free(size_mess);


  }//=============while



   ExitThread(0);
   
   return 0;

}
Единственный способ стать умнее - играть с более умным противником.
Sam Gold вне форума Ответить с цитированием
Старый 20.05.2010, 23:04   #2
Sam Gold
Форумчанин
 
Аватар для Sam Gold
 
Регистрация: 26.03.2010
Сообщений: 538
По умолчанию

А все разобрался
Единственный способ стать умнее - играть с более умным противником.
Sam Gold вне форума Ответить с цитированием
Старый 20.05.2010, 23:17   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Если разобрался ( и если не сложно) опиши что необходимо сделать.
Вдруг кому пригодится...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.05.2010, 23:33   #4
Sam Gold
Форумчанин
 
Аватар для Sam Gold
 
Регистрация: 26.03.2010
Сообщений: 538
По умолчанию

При запуске приложения:

__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{

//==========При запуске приложения======



version=MAKEWORD(2,0);

error = WSAStartup( version, &wsaData );


if ( error != 0 ){
Memo2->Text="Error occured" ;


}


if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 0 )
{

WSACleanup();

}

AnsiString port=Edit2->Text;//====IP адрес сервера===

//=============Создаем сокет==================
client = socket( AF_INET, SOCK_STREAM, 0 );

memset( &sins, 0, sizeof(sins) );

sins.sin_family = AF_INET;

sins.sin_port = htons(7007);
sins.sin_addr.s_addr = inet_addr(port.c_str());

if ( connect( client, (struct sockaddr *)&sins, sizeof(sins) ) == SOCKET_ERROR{

Memo2->Text="could not connect to server";

}

else{
Memo2->Text="Connect to server ";

}

mutex_recv=CreateMutex(NULL,FALSE,N ULL);
DWORD result_recv;
result_recv=WaitForSingleObject(mut ex_recv,0);

if(result_recv==WAIT_OBJECT_0){

RECV=CreateThread(NULL,0,CLIENT_REC V,(void *)&client,0,0);
//========Поток принимающий сообщения==========

ReleaseMutex(mutex_recv);

}

}

А отправка сообщений происходит по нажатию соответствующей кнопки
Код:
void __fastcall TForm1::Button1Click(TObject *Sender)

{
	if( first==FALSE){
	   TForm1::Button4Click(Button1)   ;


	}

	   target=Edit3->Text;//======получатель сообщения=====

	   char size_targ[10];
	   ltoa(target.Length(),size_targ,10);
	   send(client,size_targ,10,0);
	   send(client,target.c_str(),target.Length(),0);
	   //===============send message=============
	   AnsiString message;

	   message=Memo1->Text;

	   char size[10];
	   ltoa(message.Length(),size,10);
	   send(client,size,10,0);
	   Memo3->Lines->Add(message) ;
	   send(client,message.c_str(),message.Length(),0);
	   Memo1->Clear();
	   first=FALSE;

}
Единственный способ стать умнее - играть с более умным противником.
Sam Gold вне форума Ответить с цитированием
Старый 20.05.2010, 23:46   #5
Sam Gold
Форумчанин
 
Аватар для Sam Gold
 
Регистрация: 26.03.2010
Сообщений: 538
По умолчанию

Теперь если не принимать список пользователей все хорошо.
Проблемы возникают при получении списка пользователей. Ругается на этот кусок кода:
Код:
              char *size;
	  size=(char *)malloc(10);

	  recv(client,size,10,0);


	  int size_list=atol(size);

	  char *buf;
	  buf=(char *)malloc(size_list);

	  if(size_list==0 ){

		 Form1->Memo4->Text="No online users";


	  }
	  else{


		 recv(client,buf,size_list,0);   //======list of users====

		 string list(buf);



		 Form1->Memo4->Clear();
		 Form1->ComboBox1->Clear();
		 int index=0;

		 int flag=0;
		 while(flag<size_list){
			  unsigned int pos=list.find('\n',index) ;

			  string item;

			  item.assign(list,index,pos+1);

			  Form1->Memo4->Lines->Add(item.assign(list,index,pos+1).c_str());
			  Form1->ComboBox1->Items->Add(item.assign(list,index,pos+1).c_str());
			  flag=pos+1;
			  index=pos+1;

		 }

	  }
Пишет, что прочитал адрес 0x00000000 или "Точка входа в процедуру GetModuleBaseNameW не найдена в библиотеке DLL PSAPI.DLL" или System Error 1400: Недопустимый дескриптор окна.
Если все обращения к элементам формы удалить, то же самое.
Подскажите пожалуйста в чем ошибка.
Единственный способ стать умнее - играть с более умным противником.
Sam Gold вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как отключить не нужное оборудование в Windows 7? taimag Win Api 2 21.01.2010 22:00
Удалить не нужное из ListBox Shouldercannon Общие вопросы Delphi 7 20.12.2008 00:07
Направь новичка в нужное русло Walking Cat Свободное общение 7 07.07.2008 09:09
web-browser - АВТОЗАЛОГИНИТЬСЯ и отобразить только нужное Yuran Общие вопросы Delphi 0 18.02.2008 14:08