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

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

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.05.2010, 10:31   #1
Fissa
Пользователь
 
Регистрация: 23.05.2010
Сообщений: 19
По умолчанию В отдельном потоке после ф-ции accept() ничего не выполняется!!!

Помогите, объясните, плиз, почему не работает! =(
Сетевое приложение Windows Forms с использованием winsock2, написано в Microsoft Visual Studio 2008, язык С++.

Работа приложения: по нажатию на кнопку ждем всего лишь одно соединение, когда дождалиьсь, то должны стать видимыми несколько других кнопок. При этом приложение не должно зависать, т.е. используем потоки.

Код:
Код:
#pragma once
#include <winsock2.h>
#include <windows.h>

#pragma once
#include <winsock2.h>
#include <windows.h>

namespace mygame {

	using namespace System;
	…
	using namespace System::Threading;
	SOCKET ServerSocket;
	SOCKET ClientSocket;
	sockaddr_in ServerAddr;
	sockaddr_in ClientAddr;
	int ClientAddr_len;
	public ref class Form1 : public System::Windows::Forms::Form
	{
	…
	private:
		void accepting()
		{
			ClientSocket = accept(ServerSocket,(sockaddr* )&ClientAddr,&ClientAddr_len);
			this->button2->Visible = true;	           //Вот этот код не выполняется!!!
		}
	private: System::Threading::Thread^ MyThread;	           //создаем поток
	…

#pragma region Windows Form Designer generated code
		void InitializeComponent(void)
		{
			System::ComponentModel::ComponentResourceManager^  resources = (gcnew System::ComponentModel::ComponentResourceManager(Form1::typeid));
			this->MyThread = (gcnew System::Threading::Thread(gcnew System::Threading::ThreadStart(this,&mygame::Form1::accepting)));     //инициализируем поток
		…
		}
#pragma endregion
	private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
			ServerSocket = socket(AF_INET,SOCK_STREAM,0); 
			ServerAddr.sin_family = AF_INET;
			ServerAddr.sin_port = htons(5700);
			ServerAddr.sin_addr.s_addr = 0;
			bind(ServerSocket,(SOCKADDR*)&ServerAddr,sizeof(ServerAddr));
			listen(ServerSocket,1);				
			ClientAddr_len = sizeof(ClientAddr); 
			oThread2->Start();	                //запускаем поток
		 }
Всё работает кроме того, что написано после вызова accept(), т.е. запускается прога, нажимается кнопка1, прога не виснет и ждет подключения, дожидается и 100% соединение устанавливается, но вот код после этого accept() не выполняется. Всё работает - прога, кнопка, поток запускается, только вот эта неувязочка(((
Скажите, плиз, почему не выполняется код после accept() в потоке?
Или может у каго есть другие варианты как добиться того, что я хочу, потому что я уже не знаю что придумать(((

Последний раз редактировалось Fissa; 23.05.2010 в 10:34.
Fissa вне форума Ответить с цитированием
Старый 24.05.2010, 13:22   #2
Fissa
Пользователь
 
Регистрация: 23.05.2010
Сообщений: 19
По умолчанию

извините - в последней строке конечно же MyThread а не oThread2 - очепятка

Выяснилось, что и сама функция accept() не срабатывает((( так что у меня НЕ РАБОТАЕТ ПОТОК.

ПОМОГИТЕ! Объясните, что не так.
Fissa вне форума Ответить с цитированием
Старый 24.05.2010, 19:09   #3
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Код:
this->MyThread = (gcnew System::Threading::Thread(gcnew System::Threading::ThreadStart(this,&mygame::Form1::accepting)));
Пробуйте создавать поток прямо перед его вызовом. А так наверное опустили часть кода, там точно не конфликтуют ?

Последний раз редактировалось BOBAH13; 24.05.2010 в 19:13.
BOBAH13 вне форума Ответить с цитированием
Старый 25.05.2010, 09:48   #4
Fissa
Пользователь
 
Регистрация: 23.05.2010
Сообщений: 19
По умолчанию

Цитата:
Пробуйте создавать поток прямо перед его вызовом. А так наверное опустили часть кода, там точно не конфликтуют ?
И это тоже не помогло - при отладке выяснилось, что функция accept() в отдельном (не главном) потоке вообще ведет себя не как блокирующая, она не ждет подключения, выполнение переходит сразу же к след. строчке программы.

Причем я реализовывала поток и с помощью BackgroundWorker - там абсолютно тоже самое: поток запускается и тут завершается, соотвественно соединение не успевает установится, но тут еще и следующее - при попытке присоединится к программе она зависает.

Вопрос теперь в следующем - КАК ВЫНЕСТИ ACCEPT() В ОТДЕЛЬНЫЙ ПОТОК, ЧТОБ ОНА ЖДАЛА ТАКИ СОЕДИНЕНИЯ?

Последний раз редактировалось Fissa; 25.05.2010 в 09:53.
Fissa вне форума Ответить с цитированием
Старый 25.05.2010, 14:01   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а разве WSASturtup не надо?
(для каждого потока)
у вас в основном потоке оно работает?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 25.05.2010, 15:37   #6
Fissa
Пользователь
 
Регистрация: 23.05.2010
Сообщений: 19
По умолчанию

Цитата:
а разве WSASturtup не надо?
(для каждого потока)
Извините. Да конечно же, у меня эти строчки есть:

WSADATA wsaData;
WSAStartup(MAKEWORD(2,2), &wsaData);

прост забыла их дописать здесь на форуме.

Включила щас их и в создаваемый поток, в результате то же самое - accept() все равно не хочет ожидать подключения(((
Fissa вне форума Ответить с цитированием
Старый 25.05.2010, 16:22   #7
m0nax
Форумчанин
 
Аватар для m0nax
 
Регистрация: 25.09.2009
Сообщений: 525
По умолчанию

я бы посоветовал просто писать на с#, зачем вообще писать на с++ и использовать NET не понятно...
с++ хорош скоростью и независимостью от всяких фреймворков
а net удобен, код пишется легко и понятно, но он чуть медленней и требует сам фреймворк

совместим их и получается что пишется медленно, не удобно, но при этом скоростью не блещет и требует фреймворк, т.е убиты преимущества обоих

ну и конечно глюки которые не может исправить ни программист С#, ни С++
но дело ваше конечно, просто сказал что думаю )
m0nax вне форума Ответить с цитированием
Старый 25.05.2010, 16:23   #8
Fissa
Пользователь
 
Регистрация: 23.05.2010
Сообщений: 19
По умолчанию

Пепел Феникса, спасибо Вам, что навели меня на мысль!

Я перенесла весь код кнопки в создаваемый поток, т.е. инициализацию сокетов и т.д., оставила там лишь запуск потока. В итоге, все получилось!

send и recv тоже отлично работают в основном потоке, не смотря на всю инициализацию сокетов и т.д. во втором потоке.

ПРОБЛЕМА РЕШЕНА =) Тема закрыта.

P.S. Кстати я вместо тредов использовала BackgroundWorker, т.к. он намного проще, удобнее и полностью для моей проги подходит)) А прога конечно же не та, что я написала, у меня игра сетевая с немаленьким кодом (около 1000 строк собсвенного кода), не удачно работала лишь сетевая часть, т.к. это первое сетевое приложение.

Цитата:
я бы посоветовал просто писать на с#, зачем вообще писать на с++ и использовать NET не понятно...
На счет с++ - это моя курсовая работа по с++. А без NЕТ мне не обойтись - я ведь в Studio 2008 создаю прогу при помощи Windows Forms, с которыми я более-менее дружу, а вот, например, MFC для меня - темный лес.

Последний раз редактировалось Fissa; 25.05.2010 в 16:43.
Fissa вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод сообщения в отдельном потоке и т.д. Casper-SC Общие вопросы .NET 7 18.05.2010 03:32
всплывающее окно(в отдельном потоке) Virus191288 Компоненты Delphi 8 21.01.2010 13:41
Загрузка данных в отдельном потоке Dj_smart Gamedev - cоздание игр: Unity, OpenGL, DirectX 8 18.01.2010 23:29
Закачка файла происходит в отдельном потоке. Kyran29 Работа с сетью в Delphi 1 28.11.2009 01:19
Запрос к БД в отдельном потоке (Thread) tyrell lab БД в Delphi 1 14.06.2007 08:42