ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Многопоточность с использованием CreateThread [Delphi]
  #1  
Старый 24.10.2009, 05:09
GlooK
Участник форума
Регистрация: 20.04.2007
Сообщений: 174
Провел на форуме:
2310282

Репутация: 149
По умолчанию Многопоточность с использованием CreateThread [Delphi]

Нужна помощь в понимании потоков

До этого момента писал софт однопоточный. Сейчас хочу научиться писать многопоточные программы.

Как я понимаю есть несколько реализаций. Знаю что можно написать используя класс TThread и CreateThread (или как пишут, правильней через BeginThread).

Интересует именно CreateThread.

Есть например такой код:
Код:
program threads;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  WinSock;

const
mstimeout = 10000;
buffsize = 1024;

var
hSocket: TSocket;
FData: string;

function fWSRecv(wHost, wRequest: string):string;
var
wsData: TWSAData;
hHost: PHostEnt;
hAddr: TSockAddrIn;
hTimeout: TTimeVal;
iRead: integer;
hData: string;
hBuffer: array[0..buffsize] of char;
begin
 WSAStartup($202, wsData);
 hSocket := socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
 hHost := gethostbyname(PChar(wHost));
 hAddr.sin_family := AF_INET;
 hAddr.sin_port := htons(80);
 hAddr.sin_addr := pinaddr(hHost^.h_addr^)^;
 hTimeout.tv_usec := 0;
 hTimeout.tv_sec := mstimeout;
 setsockopt(hSocket, SOL_SOCKET, SO_RCVTIMEO, @hTimeout, sizeof(ttimeval));
 connect(hSocket, hAddr, SizeOf(hAddr));
 hData := '';
 Send(hSocket, wRequest[1], length(wRequest), 0);
 while (TRUE) do
 begin
  FillChar(hBuffer, SizeOf(hBuffer), 0);
  iRead := Recv(hSocket, hBuffer, length(hBuffer), 0);
  hData := hData + copy(hBuffer, 0, iRead);
  if (iRead <= 0) then break;
 end;
 CloseSocket(hSocket);
 WSACleanup;
 result := hData;
end;

begin

FData := fWSRecv('google.ru',
'GET /search?q=abc' + #13#10 +
'Host: google.ru' + #13#10 +
'User-Agent: Mozilla/5.0' + #13#10 +
'Accept: text/html' + #13#10 +
'Accept-Language: ru' + #13#10 +
'Accept-Charset: windows-1251' + #13#10 +
'Connection: close' + #13#10#13#10);

Writeln;
Writeln('Done!');
readln;
end.
Как сделать его многопоточным?

Я попробовал так:
Код:
program threads;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  WinSock,
  Windows;

const
mstimeout = 10000;
buffsize = 1024;

var
hSocket: TSocket;
FData: string;
wsData: TWSAData;
idThread: integer;
HThread: array[0..20] of THandle;

function fWSRecv(wHost, wRequest: string):string;
var
hHost: PHostEnt;
hAddr: TSockAddrIn;
hTimeout: TTimeVal;
iRead: integer;
hData: string;
hBuffer: array[0..buffsize] of char;
begin

 hSocket := socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
 hHost := gethostbyname(PChar(wHost));
 hAddr.sin_family := AF_INET;
 hAddr.sin_port := htons(80);
 hAddr.sin_addr := pinaddr(hHost^.h_addr^)^;
 hTimeout.tv_usec := 0;
 hTimeout.tv_sec := mstimeout;
 setsockopt(hSocket, SOL_SOCKET, SO_RCVTIMEO, @hTimeout, sizeof(ttimeval));
 connect(hSocket, hAddr, SizeOf(hAddr));
 hData := '';
 Send(hSocket, wRequest[1], length(wRequest), 0);
 while (TRUE) do
 begin
  FillChar(hBuffer, SizeOf(hBuffer), 0);
  iRead := Recv(hSocket, hBuffer, length(hBuffer), 0);
  hData := hData + copy(hBuffer, 0, iRead);
  if (iRead <= 0) then break;
 end;
 CloseSocket(hSocket);
 result := hData;
end;

function fThread(ptr: pointer):integer;
begin
FData := fWSRecv('google.ru',
'GET /search?q=abc' + #13#10 +
'Host: google.ru' + #13#10 +
'User-Agent: Mozilla/5.0' + #13#10 +
'Accept: text/html' + #13#10 +
'Accept-Language: ru' + #13#10 +
'Accept-Charset: windows-1251' + #13#10 +
'Connection: close' + #13#10#13#10);
ExitThread(0);
result := 0;
end;

begin
WSAStartup($202, wsData);

for idThread := 0 to 10 do
HThread[idThread] := CreateThread(nil, 0, @fThread, nil, 0, HThread[idThread]);

//WSACleanup;
Writeln;
Writeln('Done!');
readln;
end.
Но запросы не отправляются.
Имеет ли вообще данный код право на жизнь?
Можно ли так свободно использовать функции в потоке?
Если есть, дайте линки на исходники программ с использованием Winsock + CreateThread.
 
Ответить с цитированием

  #2  
Старый 24.10.2009, 15:51
Espectro
Новичок
Регистрация: 09.11.2008
Сообщений: 11
Провел на форуме:
167671

Репутация: 1
По умолчанию

держи
http://forum.sources.ru/index.php?showtopic=255212
 
Ответить с цитированием

  #3  
Старый 24.10.2009, 17:23
slesh
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме:
3288241

Репутация: 3349


Отправить сообщение для slesh с помощью ICQ
По умолчанию

код почти нормальный, но
1) если ты ничего больше с потоками делать не будешь, то сразу закрывай дискриптор потока, а не храни его в массиве
2) прототип функции которая вызывает в потоке чуть другой.
т.е. не function fThread(ptr: pointer):integer;
а function fThread(ptr: pointer):dword; stdcall;
3) после запуска потоков ты должен дождаться их завершения
в твоем случае потоки запустятся, но прога сразу же завершит свою работу.
Для таких вещей можно заюзать функцию WaitForMultipleObjects которая имеет вид;
DWORD WaitForMultipleObjects(
DWORD nCount, // кол-во хендлов
const HANDLE* lpHandles, // адрес массива с хендлами
BOOL bWaitAll, // TRUE - ожидать завершения всех, FALSE - хотябы одного
DWORD dwMilliseconds // таймаут. ставиш INFINITE - бесконечно.
);
 
Ответить с цитированием

  #4  
Старый 25.10.2009, 00:07
GlooK
Участник форума
Регистрация: 20.04.2007
Сообщений: 174
Провел на форуме:
2310282

Репутация: 149
По умолчанию

Цитата:
Сообщение от slesh  
код почти нормальный, но
1) если ты ничего больше с потоками делать не будешь, то сразу закрывай дискриптор потока, а не храни его в массиве
2) прототип функции которая вызывает в потоке чуть другой.
т.е. не function fThread(ptr: pointer):integer;
а function fThread(ptr: pointer):dword; stdcall;
3) после запуска потоков ты должен дождаться их завершения
в твоем случае потоки запустятся, но прога сразу же завершит свою работу.
Для таких вещей можно заюзать функцию WaitForMultipleObjects которая имеет вид;
DWORD WaitForMultipleObjects(
DWORD nCount, // кол-во хендлов
const HANDLE* lpHandles, // адрес массива с хендлами
BOOL bWaitAll, // TRUE - ожидать завершения всех, FALSE - хотябы одного
DWORD dwMilliseconds // таймаут. ставиш INFINITE - бесконечно.
);
1. Как закрыть дескриптор потока?
2. Функция WaitForMultipleObjects должна выглядить так:
WaitForMultipleObjects(количество_акт ивных_потоков, HThread, TRUE, INFINITE)?
Так? т.е. количество активных потоков в моем примере 10.
Я правильно понял?
 
Ответить с цитированием

  #5  
Старый 25.10.2009, 10:48
slesh
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме:
3288241

Репутация: 3349


Отправить сообщение для slesh с помощью ICQ
По умолчанию

1) CloseHandle - но т.к. ты юзаеш WaitForMultipleObjects то толжен делать после него закрытие.
2) WaitForMultipleObjects вроде правильно
 
Ответить с цитированием

  #6  
Старый 25.10.2009, 17:46
mr. ZetRikS
Познающий
Регистрация: 17.07.2009
Сообщений: 47
Провел на форуме:
131272

Репутация: 4
По умолчанию

http://narod.ru/disk/14455913000/%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B8.rar.html

Вот исходничек... я когда то программил... помоему то, что нужно...
Асинхронная работа...
 
Ответить с цитированием

  #7  
Старый 25.10.2009, 19:26
>>serhio<<
Познающий
Регистрация: 10.02.2009
Сообщений: 40
Провел на форуме:
59352

Репутация: 0
По умолчанию

Плз отредактируйте две задачки на Pascale, а то постоянные ошибки достали!!!

program chast1;
uses crt;
var a,y,x: real;
b:=Pi;
c:=2*Pi;
dety:=Pi/4;
y:=b;
while y < = c do
begin
x:=1-2*cos(a*y)+ln(y);
a:=ln(y)/ln(2);
writeln(y,x,a);
y:=y+dety;
end;
readln;
end.

program chast2;
x,y,a,b,c,dety:real;
i,n:integer
begin
b:=pi;
c:=2*pi;
det y:=pi/4;
n:=trune ((c-b)/det y);
for i:=0 to n do
begin
y:=b+(dety*i);
a:=logln(y)/ln(2);
x:=1-2*cos(a*y)+ln(y);
writeln(x,a,y);
end;
readln;
end.
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Многопоточность на PHP Shaitan-Devil Авторские статьи 14 26.02.2009 18:06
[Delphi] Добавить многопоточность бруту Navern С/С++, C#, Delphi, .NET, Asm 7 09.02.2007 10:19
Защита Web-сервисов с использованием mod_security w00d Чужие Статьи 1 11.07.2005 14:47



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ