Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.06.01;
Скачать: [xml.tar.bz2];

Вниз

Проблемы с потоками   Найти похожие ветки 

 
Res   (2008-05-04 22:49) [0]

Потоки висят в системы и не уничтожаются.... хотя должны :)
BeginThread(nil,0,Addr(Thread),PCHar(msg),0,id1);

function thread(thcommand:string): Integer;
..
pg:=getpage(thcommand);
..
end;

Такое ощущение, что проблема в функции getpage.. когда я использовал indy  компанент, то все было норм. Но я незнаю как сделать таймаут, после которого, функция останавливает свою работу.


function getpage(url:string):string;
var
s: TSocket;
data: TWSAData;
Addr: TSockAddr;
Recived: Integer;
Buff: array [0..1023] of Char;
HTTPRequest,HTTPResponse,path,name: string;
y,n:integer;
begin
 if(copy(url,1,7)<>"http://") then
 begin
   result:="";
   exit;
 end;
 url:=copy(url,8,length(url));
 if(Pos("/",url)<>0) then
 begin
 n:=length(url);
 for y:=1 to n do
 begin
   if(url[y]="/") then
   begin
     name:=copy(url,1,y-1);
     path:=copy(url,y,n);
     break;
   end;
 end;
end
else
begin
     name:=url;
     path:="/";
end;
WSAStartup($101, data);
s:=socket(AF_INET, SOCK_STREAM,IPPROTO_TCP);
Addr.sin_family:=AF_Inet;
Addr.sin_port:=htons(80);
Addr.sin_addr.S_addr:=inet_addr(pChar(NameToIP(name)));
if (connect(s,Addr,SizeOf(TSockAddr)) <> SOCKET_ERROR) then
  begin
    HTTPRequest:="GET "+Path+" HTTP/1.1"+#13#10+"Host: "+Name+#13#10+"Connection: Close"+#13#10#13#10;
     try
       send(s, HTTPRequest[1], 1024,0);
     except
     end;
    HTTPResponse:= "";
    Recived:= 1;
      while Recived <> 0 do
      begin
        try
        Recived:= recv(s, Buff, 1024, 0);
        except
        end;
        HTTPResponse:= HTTPResponse + Copy (Buff,0,Recived);
      end;
    closesocket(s);
    result:=HTTPResponse;
  end;
end;


Заранее спасибо за советы.


 
Loginov Dmitry ©   (2008-05-04 22:57) [1]

> BeginThread(nil,0,Addr(Thread),PCHar(msg),0,id1);
>
> function thread(thcommand:string): Integer;


Какое-то издевательство над строками! Неужели это прокатывает? :)
Переменная "msg", полагаю, глобальная?


 
Res   (2008-05-04 23:02) [2]

msg - глобальная переменная )))
Да, прокатывает, поток запускается... но он висит и не уничтожается :(( Из за этого через 10 минут, моя прога жрет 70% проца(Dual Xeon 2.6Ghz, 8 ядерный)


 
Loginov Dmitry ©   (2008-05-04 23:17) [3]

> но он висит и не уничтожается :(( Из за этого через 10 минут,
> моя прога жрет 70% проца(Dual Xeon 2.6Ghz, 8 ядерный)


Проверь, не зацикливается ли код на


>      while Recived <> 0 do
>      begin
>        try
>        Recived:= recv(s, Buff, 1024, 0);
>        except
>        end;
>        HTTPResponse:= HTTPResponse + Copy (Buff,0,Recived)
> ;
>      end;


Это - рассадник глюков!
Что будет при Exception в recv? Ошибка гасится, но у Recived остается старое значение, которое все равно передается в Copy, в результате скопировано может быть что угодно, любой мусор.

Воспользуйся отладчиком в конце концов!


 
Loginov Dmitry ©   (2008-05-04 23:24) [4]

Кстати, при вызове Copy() массив Buff автоматически преобразовывается в строку String (к тому же достаточно затратная операция), а в String нумерация элементов начинается с единицы, поэтому вместо нолика в Copy (по правильному) должна быть единица).


 
Res   (2008-05-04 23:29) [5]


> Recived остается старое значение

Спасибо, помогло ) пошел тестить


 
DVM ©   (2008-05-04 23:36) [6]


>  HTTPResponse:= HTTPResponse + Copy (Buff,0,Recived)

А если в ответе сервера бинарные данные будут?
А вообще, код жуткий, от начала и до конца. Он не будет работать в Интернет. Нигде не анализируется возвращаемые сетевыми функциями значения.


 
Res   (2008-05-04 23:53) [7]

Все равно проц нагружается на 50%

Кол-во потоков: 14 и это значение постоянно растет...


 
Loginov Dmitry ©   (2008-05-04 23:57) [8]

> Все равно проц нагружается на 50%


Ну это уже прогресс!
Значит все-таки в правильном направлении движешься! :)))


 
Loginov Dmitry ©   (2008-05-04 23:58) [9]

> Кол-во потоков: 14 и это значение постоянно растет


Не боись! Дойдет до 2048 - само остановится!


 
Res   (2008-05-05 00:02) [10]

)))


 
DVM ©   (2008-05-05 00:02) [11]


> Res   (04.05.08 23:53) [7]
> Все равно проц нагружается на 50%

А что ты хотел то? С таким кодом. Как ты думаешь. что будет если recv будет возвращать SOCKET_ERROR все время?


 
Res   (2008-05-05 00:07) [12]

      while Recived <> 0 do
      begin
        try
        Recived:= recv(s, Buff, 1024, 0);
        except
             Recived:= 0;
        end;
        HTTPResponse:= HTTPResponse + Copy (Buff,1,Recived);
      end;

то будет... все норм :)


 
DVM ©   (2008-05-05 00:10) [13]


> то будет... все норм :)

Ничего не будет норм. Будет бесконечный цикл. SOCKET_ERROR  = -1.
И твой try...except тут как собаке пятая нога.


 
Res   (2008-05-05 00:12) [14]

while Recived > 0 do
     begin
       try
       Recived:= recv(s, Buff, 1024, 0);
       except
            Recived:= 0;
       end;
       HTTPResponse:= HTTPResponse + Copy (Buff,1,Recived);
     end;
Тогда так, будет верно?


 
DVM ©   (2008-05-05 00:20) [15]


> Тогда так, будет верно?

Уже лучше, даже может уже и заработает. Recv не возбуждает вроде исключений, так что try...except тут бесполезен. Recived:= 0; никогда не будет выполнено. Да и все равно этот код не для непредсказуемого Интернет. Для локальной сети и то с оговорками.


 
Сергей М. ©   (2008-05-05 08:40) [16]


> Res   (05.05.08 00:12) [14]


Грабли будут еще до-о-олго лупить тебя, до тех пор пока не научишься хотя бы основным приемам отладки своих программ средствами встроенного в Делфи отладчика)



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2008.06.01;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.039 c
15-1208853107
Студент
2008-04-22 12:31
2008.06.01
SQL


15-1208497739
Дмитрий С
2008-04-18 09:48
2008.06.01
Большой ресурс. Правильно ли?


3-1198915557
Данила
2007-12-29 11:05
2008.06.01
Ай нид хэлп!


15-1208427995
@!!ex
2008-04-17 14:26
2008.06.01
Обновлений картинки на рабочем столе.


2-1210157112
Mishenka
2008-05-07 14:45
2008.06.01
Как вывести монитор из стендбая?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский