Помогите с Асинхронным вводом на C++

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by ShkiperLol, 14 Jun 2010.

  1. ShkiperLol

    ShkiperLol Banned

    Joined:
    17 Apr 2010
    Messages:
    182
    Likes Received:
    1
    Reputations:
    0
    народ помогите пожалуйста раздуплиться а асинхронным вводом на С++.Очень нада!
    И не надо посылать меня в гугл,я там уже был,там нет той инфы которая мне нада.
    Пытаюсь записать на дискету информацию в файл,но она записуеться синхронно.Что я делаю неправильно?

    код:
    Code:
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    HANDLE event=CreateEvent(0,false,true,0);
    HANDLE fil=CreateFile("a:\\temp.txt",GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_FLAG_NO_BUFFERING|FILE_FLAG_OVERLAPPED,NULL);
    char buf[90000];
    OVERLAPPED over;
    over.hEvent=event;
    strcpy(buf,Form1->Memo1->Text.c_str());
    DWORD out;
    DWORD err;
    DWORD res;
    WriteFile(fil,buf,90000,NULL,&over);
    
    }
    
    В MSDN был намек на то что нада менять позицию в offset самому,может в етом проблема?
     
  2. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    на флешки и флопики насколько помню не дает писать асинхронно. проверь запись большого файла на диск C:\ например.

    Тут только создать поток записи вручную вариант прокатит. Хотя может что изменилось за то время, када я этим баловался.
     
  3. ShkiperLol

    ShkiperLol Banned

    Joined:
    17 Apr 2010
    Messages:
    182
    Likes Received:
    1
    Reputations:
    0
    Ето не выход,я хочю разобраться именно с асинхронным вводом-выводом.
    Тут вы не правы,асынхронный ввод-вывод какраз и создан для работы с носителями,скорость записи в которых очень медленная.
     
  4. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    Ну ждемс проверки записи на винч. Если не норм - значит косяк в коде. Если норм - значит тоже самое у меня было.

    И да, в коде нету задания смещения в структуре overlapped. Насколько помню должна быть.

    This member is nonzero only when performing I/O requests on a seeking device that supports the concept of an offset (also referred to as a file pointer mechanism), such as a file. Otherwise, this member must be zero.

    А вот то, о чем я говорил. Я делал программу которая пишет большой файл в 20 кусков, т.е. если 20 метров файл, то я 20 раз стартую запись по метру, меняя смещение этого куска. На флешках такое не прокатывало. Точнее на моей старой флешке.

    Ну а из ошибко еще - структура не проинициализированна нулями. Хотя как себя ведет борланд яхз. Но обычно делают OVERLAPPED over = {0};
     
    #4 Ra$cal, 14 Jun 2010
    Last edited: 14 Jun 2010
  5. ShkiperLol

    ShkiperLol Banned

    Joined:
    17 Apr 2010
    Messages:
    182
    Likes Received:
    1
    Reputations:
    0
    У вас нет случайно куска кода где нужно указывать смещение?
     
  6. ShkiperLol

    ShkiperLol Banned

    Joined:
    17 Apr 2010
    Messages:
    182
    Likes Received:
    1
    Reputations:
    0
    Я так понял что указывать смещеные прийдеться в цикле,но какойже ето тогда будет асинхронный ввод?Цикл то затормозит работу программы.Или я неправ?
     
  7. ShkiperLol

    ShkiperLol Banned

    Joined:
    17 Apr 2010
    Messages:
    182
    Likes Received:
    1
    Reputations:
    0
    В борланде ето не играет абсолютно никакой роли!
     
  8. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    нет, все коды остались на сгоревшем винче. но все сводилось к циклу типа
    Code:
    while(leftSize > chunkSize){
        over.offset = curChunkOffset;
        curChunkOffset += chunkSize;
        leftSize  -= chunkSize;
    
        // запись
    
    Дальше не помню, где указывается объем записываемых данных. Еще важно там было плодить или нет оверлаппинги. Тоже уже не помню.

    Программу не затормозит, ибо вызов WriteFile будет асинхронным, то есть цикл дальше будет работать. Когда он передаст системе все куски для записи - он завершится и программы выполнится дальше.
     
  9. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    О, повезло вам.

    https://wasm.ru/forum/viewtopic.php?id=26378 мой топик еще жив.
     
  10. ShkiperLol

    ShkiperLol Banned

    Joined:
    17 Apr 2010
    Messages:
    182
    Likes Received:
    1
    Reputations:
    0
    Спасибо!!!!!!То что нужно!
     
  11. ShkiperLol

    ShkiperLol Banned

    Joined:
    17 Apr 2010
    Messages:
    182
    Likes Received:
    1
    Reputations:
    0
    И всетаки с флопиком не работает.А жаль,тогда я больше не вижу надобности применения етой технологии кроме как при записи в файл по сети,или через синий зуб....
     
  12. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    Что именно не работает? Блочится поток? Делай запись в отдельном потоке.
     
  13. ShkiperLol

    ShkiperLol Banned

    Joined:
    17 Apr 2010
    Messages:
    182
    Likes Received:
    1
    Reputations:
    0
    Функция должна сразу вернуть управление,а она возвращает только после записи.
     
  14. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    Это и называется блокировка потока. Значит делай CreateThread, и запись уже там.
     
  15. d_x

    d_x Banned

    Joined:
    25 Mar 2008
    Messages:
    558
    Likes Received:
    650
    Reputations:
    210
    В c++ лучше делать _beginthread и _endthread или _beginthreadex и _endthreadex соответственно.
     
  16. ShkiperLol

    ShkiperLol Banned

    Joined:
    17 Apr 2010
    Messages:
    182
    Likes Received:
    1
    Reputations:
    0
    ето я знаю,я Рихтера тоже читал)))))
    А вот из-за чего он блокируеться во время записи на флопик?
    вот в етой статье,на делфях правда,в примере какраз используеться асинхронный вывод на флопик.

    http://pblog.ru/?p=74
     
  17. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    ну я говорю, проверь запись на жесткий диск. если асинхронно - значит ограничения такие. Вероятнее всего трабла из-за той цитаты что я привел. Для записи в асинхронке требуется указать в оверлаппед смещение, куда пишешь. Там же сказано что не все девайсы поддерживают такое.