![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Tthread и с чем его едят?
malefik © (2006-11-08 10:28:00)Добрый времени суток!
несложный вопрос....
допустим обьявлен класс унаследованный от tthread. в секции public обьявлено поле типа int.
в приложении при создании формы создается обьект....этого класса....
TMyThread * thread = new TMyThread(false);
могу я после этого обратится к полю...
например
thread->имя_поля
или всю работы всегда проводить через
Synchronize???
malefik (2006-11-08 15:30:00) [21]а то что клиент сокет находится в основной нити приложения это как???
Anatoly Podgoretsky (2006-11-08 15:29:00) [22]> malefik (08.11.2006 14:57:18) [18]
Это вроде не Дельфи
malefik (2006-11-08 15:26:00) [23]переписываю клиента на блокирующие.....потому как в неблокирующих нет гарантии ....а типы соединений у меня разные от гпрс до лан
пример....поплюйтесь......
void __fastcall TClientThread::Execute()
{
AnsiString _cmd_send;
do
{
if (_socket->Connected)
{
switch (_cmd)
{
case cm_authorize:
{
if (!_autorized)
{
_cmd = cm_idle;
Synchronize(_get_autorize_info);
_cmd_send = "<AU|" + _uname + "|" + _upassword + ">";
_stream->Write(_cmd_send.c_str(), _cmd_send.Length());
_wait_and_receive_data();
}
}
}
}
}while( !Terminated );
}
AnsiString TClientThread::_wait_and_receive_data(void)
{
AnsiString _buffer;
char buffer[BUFFERSIZE];
memset(buffer, 0, sizeof(buffer));
if (_socket->Connected)
{
while(_stream->WaitForData(CMDWAITTIME))
{
_stream->Read(buffer, sizeof(buffer));
_buffer += StrPas(buffer);
}
}
return buffer;
}
Сергей М. (2006-11-08 15:17:00) [24]
> дергаю с него данные в блокирующем режиме
Ничто не мешает задействовать неблокирующий режим, тогда надобность в доп.нити, возможно. отпадет.
> waitfordata останавлвает основную нить
Не основную, а текущую.. на, заметь, заданноевремя ... которое не обязоно быть указано не иначе как INFINITE
malefik (2006-11-08 15:14:00) [25]не совсем...........есть клиент....который цепляется к серверу.....вот и дергаю с него данные в блокирующем режиме.....waitfordata останавлвает основную нить.....
Сергей М. (2006-11-08 15:02:00) [26]Ты мультипоточный сервер что ли изобретаешь ?
malefik (2006-11-08 14:57:00) [27]немного повторюсь.....но все-же..
в конструкторе нити у меня передается указатель на некий обьект .......который мне необходим внутри нитки......для создания обьектов некого другого класса ....и для просмотра свойств этого обьетка на предмет чего либо......
Вопрос ....как все таки лучше сделать......и самое главное правильно ли это
TWinSocketStream * _stream; обьект который создается внутри нити
TCustomWinSocket* _socket; передаваемый указатель
Сергей М. (2006-11-08 13:00:00) [28]
> Percent (08.11.06 10:57) [10]
> Любая операция с этим типом данных проходит, в максимуме,
> за один такт процессора, поэтому этот тип данных - потокобезопасный.
В мультипроцессорных системах и с учетом DMA не стоит на это полагаться.
Anatoly Podgoretsky (2006-11-08 11:38:00) [29]> DVM (08.11.2006 10:51:08) [8]
> Насчет интегер я не уверен тоже. boolean - за него можно вроде не беспокоиться.
Беспокоиться есть повод всегда, все зависит от того какой код будет сгенерирован, если подобный этому, то опасно, в [ebx+offset] пускай будет Integer или Boolean, не принципиально, видно что операция не атомарная.
mov eax,[ebx+offset]
inc eax
mov [ebx+offset], eax
Anatoly Podgoretsky (2006-11-08 11:34:00) [30]> malefik (08.11.2006 10:49:07) [7]
В каком месте и в каком контексте?
Anatoly Podgoretsky (2006-11-08 11:27:00) [31]> Percent (08.11.2006 10:40:06) [6]
Возьми опасный. Код приведеный DVM прекрасно иллюстрирует возможность исполнения не в главном потоке с помощью Synchronize
Anatoly Podgoretsky (2006-11-08 11:23:00) [32]> DrPass (08.11.2006 10:30:01) [1]
Я бы сказал больше, только для выполнения в главном потоке и не для чего более, а вот желание исполнять это там для незащищенных операций похвально, но это не назначение этого метода, это повод.
DVM (2006-11-08 11:10:00) [33]
> Если не уверен, то RTFM. Избыточные проверки (тем более
> критические секции) в коде - дурной тон программирования
Я Integer поле привел лишь для иллюстрации метода. Надо было наверное string указать, чтобы у не возникало вопросов.
Лучше сделать избыточную проверку, будучи неуверенным в надежности кода, чем не сделать ее и потом сомневаться в надежности.
Насчет атомарности операций с Integer я в самом деле не был уверен.
DrPass (2006-11-08 11:04:00) [34]
> Делай все как я написал, проблем не будет. Насчет интегер
> я не уверен тоже.
Если не уверен, то RTFM. Избыточные проверки (тем более критические секции) в коде - дурной тон программирования
Percent (2006-11-08 10:57:00) [35]Насчет интегер я не уверен тоже
Любая операция с этим типом данных проходит, в максимуме, за один такт процессора, поэтому этот тип данных - потокобезопасный.
Percent (2006-11-08 10:52:00) [36]А ansistring ? его надо через синхронизацию...
Операции с AnsiString не атомарны, поэтому работа с ними в контексте нескольких потоков - только с использованием механизмов синхронизации или блокировки.
DVM (2006-11-08 10:51:00) [37]
> malefik (08.11.06 10:49) [7]
> А ansistring ? его надо через синхронизацию...
Делай все как я написал, проблем не будет. Насчет интегер я не уверен тоже. boolean - за него можно вроде не беспокоиться.
вот еще тебе пригодится книжка:
http://mbo88.narod.ru/ToC.html
malefik (2006-11-08 10:49:00) [38]А ansistring ? его надо через синхронизацию...
Percent (2006-11-08 10:40:00) [39]обьявлено поле типа int
Тип integer - потокобезопасный. Поэтому можно. Правда, при этом надо учитывать и в основном потоке, и в дополнительном, что значение этого поля может измениться совершенно произвольно в любой момент времени. Но это уже проблема алгоритма. А с доступом к полю типа integer, повторюсь, проблем не будет.
DVM (2006-11-08 10:39:00) [40]Вот из другого потока теперь можно смело обращаться к TMyThread.MyParam