Показать сообщение отдельно

  #9  
Старый 30.04.2010, 01:20
greki_hoy
Познающий
Регистрация: 04.03.2010
Сообщений: 32
Провел на форуме:
32525

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

на винсок можно так две апи
Код:
download_file(... );
upload_file(... );
сделать их рабочими элементами пула потоков
надо например скачaть делаеш асинхронный вызов
Код:
DOWNLOAD_INFO Args = malloc(sizeof(Args));
Args.Link = strdup(link);
Args/... еще что то
QueueUserWorkItem(download_file, &Args, WT_SET_MAX_THREADPOOL_THREADS(0, 12));
или
QueueUserWorkItem(upload_file, &Args, WT_SET_MAX_THREADPOOL_THREADS(0, 12));
и все следующие запросы в очередь можно ставить асинхронно
можно например выдать 12 запросов на ввод вывод
12 файлов скачается за время одного лиш бы канал позволял
в чем плюс потоки не надо создавать и разрушать так часто
после выполнения рабочего элемента этот же поток в пуле ждет следующий запрос
а если нет свободных все 12 заняты вводом выводом и канал широкий
то можно еще 12 добавить венда тут же создаст еще 12 потоков
и передаст им рабочие элементы а после если долгое время запросов не будет
начнет очищать пул от лишних потоков
все это флагами одного из параметров QueueUserWorkItem
регулируется

а это пример download_file
Код:
unsigned long __stdcall download_file(DOWNLOAD_INFO *pArgs)
{
//... формируем post ну тут элементарно
//... скачиваем тоже просто
//... освобождаем память из под аргументов
free(pArgs);
return 0;
}
если у нас 42 потока висят на вводе выводе переключений контекстов нет
имеет смысл столько создать если канал широкий за время 1 файла
скачивать 42

ну и по такому же принципу написать upload_file
должно мега быстро работать да и скачивать можно в три - 4 потока
один файл если например сервер на одно соединение рубит скорость
но поддерживает скачивание файлов по частям
 
Ответить с цитированием