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

Проблема с многопточностью. Borland C++ Builder
  #1  
Старый 04.04.2010, 11:49
Аватар для mailbrush
mailbrush
Познавший АНТИЧАТ
Регистрация: 24.06.2008
Сообщений: 1,996
Провел на форуме:
6075534

Репутация: 2731


Отправить сообщение для mailbrush с помощью ICQ
По умолчанию Проблема с многопточностью. Borland C++ Builder

Возникла проблема с многопоточностью. Есть 100-поточная программа, которая для теста обращается к странице http://example.com. Проблема в том, что при первом нажатие кнопки (код ниже) происходит не 100, а рандумное количество запросов до 100 (н.п. 84, 95, 66, 52)... При втором же - ровно 100, как положено. Отснифал Process Explorer'ом - потоки создаются все, но вот запросы идут не все. И это только при ПЕРВОМ нажатии кнопки. При втором и всем последующим все идет как надо. Почему? Буду очень благодарен за помощь. Использую Borland C++ Builder 6.

Вот код запуска потоков:
PHP код:
TMyThread Thr[1000];
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int i;

for(
i=0;i<100;i++)
Thr[i] = new TMyThread(false);

Вот метод Execute:
PHP код:
void __fastcall TMyThread::Execute()
{
 
HINSTANCE libcurl NULL;
     if((
libcurl LoadLibrary"libcurl.dll" )) == NULL)
          
MessageBox(NULL"ы"MB_OK0);

     
CURL*(__stdcall *curl_easy_init)();
     
CURLcode(__stdcall *curl_easy_setopt )(CURL *curlCURLoption option, ...);
     
CURLcode (__stdcall *curl_easy_perform )(CURL *curl);
     
void (__stdcall *curl_easy_cleanup )(CURL *curl);
     
curl_easy_init=(CURL*(__stdcall*)())GetProcAddress(libcurl"curl_easy_init" );
     
curl_easy_setopt=(CURLcode(__stdcall *)(CURL *curlCURLoption option, ...))
     
GetProcAddress(libcurl"curl_easy_setopt");
     
curl_easy_perform=(CURLcode(__stdcall *)(CURL *curl))GetProcAddress(libcurl"curl_easy_perform" );
     
curl_easy_cleanup=(void (__stdcall *)(CURL *curl))GetProcAddress(libcurl"curl_easy_cleanup" );

CURL *curl;
curl curl_easy_init();
curl_easy_setopt(curlCURLOPT_URL"http://www.example.com/");
curl_easy_setopt(curlCURLOPT_WRITEFUNCTIONWriter);
curl_easy_setopt(curlCURLOPT_WRITEDATA, &table);
curl_easy_perform(curl);
curl_easy_cleanup(curl);


 
Ответить с цитированием

  #2  
Старый 04.04.2010, 12:03
Аватар для M_script_
M_script_
Постоянный
Регистрация: 29.10.2008
Сообщений: 306
Провел на форуме:
1819761

Репутация: 180
Отправить сообщение для M_script_ с помощью ICQ
По умолчанию

Этот код сделай в крит.секции:
Код:
HINSTANCE libcurl = NULL; 
     if((libcurl = LoadLibrary( "libcurl.dll" )) == NULL) 
          MessageBox(NULL, "ы", MB_OK, 0); 

     CURL*(__stdcall *curl_easy_init)(); 
     CURLcode(__stdcall *curl_easy_setopt )(CURL *curl, CURLoption option, ...); 
     CURLcode (__stdcall *curl_easy_perform )(CURL *curl); 
     void (__stdcall *curl_easy_cleanup )(CURL *curl); 
     curl_easy_init=(CURL*(__stdcall*)())GetProcAddress  (libcurl, "curl_easy_init" ); 
     curl_easy_setopt=(CURLcode(__stdcall *)(CURL *curl, CURLoption option, ...)) 
     GetProcAddress(libcurl, "curl_easy_setopt"); 
     curl_easy_perform=(CURLcode(__stdcall *)(CURL *curl))GetProcAddress(libcurl, "curl_easy_perform" ); 
     curl_easy_cleanup=(void (__stdcall *)(CURL *curl))GetProcAddress(libcurl, "curl_easy_cleanup" );
 
Ответить с цитированием

  #3  
Старый 04.04.2010, 12:38
Аватар для mailbrush
mailbrush
Познавший АНТИЧАТ
Регистрация: 24.06.2008
Сообщений: 1,996
Провел на форуме:
6075534

Репутация: 2731


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

M_script_, не помогает.

Вот так сделал:
PHP код:
EnterCriticalSection(&Form1->CS);
 
HINSTANCE libcurl NULL;
     if((
libcurl LoadLibrary"libcurl.dll" )) == NULL)
          
MessageBox(NULL"û"MB_OK0);

     
CURL*(__stdcall *curl_easy_init)();
     
CURLcode(__stdcall *curl_easy_setopt )(CURL *curlCURLoption option, ...);
     
CURLcode (__stdcall *curl_easy_perform )(CURL *curl);
     
void (__stdcall *curl_easy_cleanup )(CURL *curl);
     
curl_easy_init=(CURL*(__stdcall*)())GetProcAddress(libcurl"curl_easy_init" );
     
curl_easy_setopt=(CURLcode(__stdcall *)(CURL *curlCURLoption option, ...))
     
GetProcAddress(libcurl"curl_easy_setopt");
     
curl_easy_perform=(CURLcode(__stdcall *)(CURL *curl))GetProcAddress(libcurl"curl_easy_perform" );
     
curl_easy_cleanup=(void (__stdcall *)(CURL *curl))GetProcAddress(libcurl"curl_easy_cleanup" );
LeaveCriticalSection(&Form1->CS); 
А в Unit1.h прописал:
PHP код:
public:        // User declarations
        
CRITICAL_SECTION CS
За первым разом только что выполнилось 84 запроса, нажал еще раз - ровно 100.
 
Ответить с цитированием

  #4  
Старый 04.04.2010, 14:05
Аватар для M_script_
M_script_
Постоянный
Регистрация: 29.10.2008
Сообщений: 306
Провел на форуме:
1819761

Репутация: 180
Отправить сообщение для M_script_ с помощью ICQ
По умолчанию

Уверен на 99.9%, что ты забыл про InitializeCriticalSection(&CS); =)
(перед запуском потоков в Button1Click)

Последний раз редактировалось M_script_; 04.04.2010 в 14:07..
 
Ответить с цитированием

  #5  
Старый 04.04.2010, 14:32
Аватар для mailbrush
mailbrush
Познавший АНТИЧАТ
Регистрация: 24.06.2008
Сообщений: 1,996
Провел на форуме:
6075534

Репутация: 2731


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

Сделал я это, только не в Button1Click, а в
Цитата:
__fastcall TForm1::TForm1(TComponent* Owner)
Вот щас перенес инициализацию в Button1Click. Заметил, что колличество запросов увеличилось до 90-95. Но никак не 100, как мне требовалось. За вторым и последующими нажатиями все ок (ровно 100), как и было раньше.

M_script_, зайди, пожалуйста, в ICQ, или напиши мне в 674542, не могу до тебя достучатся.

Последний раз редактировалось mailbrush; 04.04.2010 в 14:35..
 
Ответить с цитированием

  #6  
Старый 04.04.2010, 14:52
Аватар для mailbrush
mailbrush
Познавший АНТИЧАТ
Регистрация: 24.06.2008
Сообщений: 1,996
Провел на форуме:
6075534

Репутация: 2731


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

Фух, решил проблему. Спасибо, M_script_.
Вот рабочий метод Execute():
PHP код:
void __fastcall TMyThread::Execute()
{
EnterCriticalSection(&Form1->CS);
 
HINSTANCE libcurl NULL;
     if((
libcurl LoadLibrary"libcurl.dll" )) == NULL)
          
MessageBox(NULL"û"MB_OK0);

     
CURL*(__stdcall *curl_easy_init)();
     
CURLcode(__stdcall *curl_easy_setopt )(CURL *curlCURLoption option, ...);
     
CURLcode (__stdcall *curl_easy_perform )(CURL *curl);
     
void (__stdcall *curl_easy_cleanup )(CURL *curl);
     
curl_easy_init=(CURL*(__stdcall*)())GetProcAddress(libcurl"curl_easy_init" );
     
curl_easy_setopt=(CURLcode(__stdcall *)(CURL *curlCURLoption option, ...))
     
GetProcAddress(libcurl"curl_easy_setopt");
     
curl_easy_perform=(CURLcode(__stdcall *)(CURL *curl))GetProcAddress(libcurl"curl_easy_perform" );
     
curl_easy_cleanup=(void (__stdcall *)(CURL *curl))GetProcAddress(libcurl"curl_easy_cleanup" );

CURL *curl;
curl curl_easy_init();
LeaveCriticalSection(&Form1->CS); 
curl_easy_setopt(curlCURLOPT_URL"http://www.example.com/");
curl_easy_setopt(curlCURLOPT_WRITEFUNCTIONWriter);
curl_easy_setopt(curlCURLOPT_WRITEDATA, &table);
curl_easy_perform(curl);
curl_easy_cleanup(curl);

 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с дедиками [help!] Sniper482 Безопасность 4 14.09.2009 21:22
Проблема с дллкой (С++ Builder) _nic С/С++, C#, Delphi, .NET, Asm 4 09.09.2009 12:19
Embarcadero: C++ Builder 2009 Kollinz С/С++, C#, Delphi, .NET, Asm 1 11.08.2009 11:27
[Статья] Создание расширения для Windows Explorer при помощи C++ Builder Dobby007 С/С++, C#, Delphi, .NET, Asm 2 29.03.2009 08:58
С++ Builder проблема с кучей _nic С/С++, C#, Delphi, .NET, Asm 13 06.02.2009 01:26



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


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




ANTICHAT.XYZ