Что означает это ошибка?

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Farcar, 15 Nov 2011.

  1. Farcar

    Farcar Banned

    Joined:
    6 Nov 2011
    Messages:
    55
    Likes Received:
    0
    Reputations:
    0
    Пишу программу с потоками, потоки загружают строку из файла, обробатуют ее отсылают на сервер методом пост и обратывают ответ, вконце выдает ошибку,

    [​IMG]


    Что не правильно???
     
  2. inCode

    inCode Member

    Joined:
    20 Jun 2011
    Messages:
    141
    Likes Received:
    22
    Reputations:
    5
    исключение в классе, неправильная операция, canvas неподдерживает отрисовку.
    Какой вопрос, такой и ответ.

    Выкладывай код...
     
  3. InfectedM

    InfectedM Elder - Старейшина

    Joined:
    4 Nov 2007
    Messages:
    155
    Likes Received:
    12
    Reputations:
    0
    мб http://www.sql.ru/forum/actualthread.aspx?tid=384055
     
  4. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    /showpost.php?p=2724229&postcount=7
    подробнее рассматривалось в Этой /showthread.php?t=280152 теме. там много срача, но суть уловите.
    ИЗ ПОТОКОВ НЕЛЬЗЯ ОБРАЩАТЬСЯ К ВИЗУАЛЬНЫМ КОМПОНЕНТАМ
    Прежде чем использовать их в своей программе, почитайте литературу. в ссылках выше есть линки на винград, там очень хорошая тема
     
  5. Farcar

    Farcar Banned

    Joined:
    6 Nov 2011
    Messages:
    55
    Likes Received:
    0
    Reputations:
    0
    признаюсь чесно, код нашел в сети, добавил и переделал пару строк, и вот что вышло,




    запрос отправляется, но в конце ошибка
     
  6. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    на днях уже была тема с этим кодом и аналогичной проблемой.
    Code:
    if Thread=0 then ShowMessage('OK');
    вот этого в потоке делать нельзя. ТОлько через Synchronize
     
  7. Farcar

    Farcar Banned

    Joined:
    6 Nov 2011
    Messages:
    55
    Likes Received:
    0
    Reputations:
    0
    я видел эту тему, а о Synchronize можно подробней, если не сложно с примером в моем коде
     
  8. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    я кинул ссылки, читайте.
    от того, что я за Вас сейчас напишу код Вы умнее не станете. А если прочитаете, то вполне возможно, что толк будет
     
  9. Farcar

    Farcar Banned

    Joined:
    6 Nov 2011
    Messages:
    55
    Likes Received:
    0
    Reputations:
    0
    прогуглил Sy n c h r o n i z e

    так правильно?
     
  10. 090808

    090808 Member

    Joined:
    15 Mar 2009
    Messages:
    171
    Likes Received:
    46
    Reputations:
    10
    Тут пример синхронизации я писал: /showpost.php?p=2900066&postcount=4
     
  11. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    Ioffe, Вы там пишете в теле рабочего потока (Execute)
    Code:
    procedure Thread1.Execute; 
    begin 
      http:=Tidhttp.Create(nil);http.HandleRedirects:=tr  ue; 
      while (id<10000) do begin 
        synchronize(getid); 
        RegExp := TRegExpr.Create; 
        try RegExp.InputString := Http.Get('http://site/index.html?user='+inttostr(id)); except;end; 
        RegExp.Expression := '<span class=cnavy style='#39'font: bold 12px Arial, Verdana'#39'>(.*?)</span>'; 
        if RegExp.Exec then 
        repeat 
          [SIZE=3][B][COLOR=DarkOrange]Form1.Memo1.Lines.Add(RegExp.Match[1]); [/COLOR][/B][/SIZE]
        until not RegExp.ExecNext; 
        RegExp.Free; 
      end; 
      http.free; 
    end;
    А как мы с Вами знаем обращатся к визуальным компонентам из потока нельзя.
     
    #11 xophet, 15 Nov 2011
    Last edited: 15 Nov 2011
  12. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    В любой статье или книге пишут что нельзя. Врут наверное, с них станется :D
     
  13. Farcar

    Farcar Banned

    Joined:
    6 Nov 2011
    Messages:
    55
    Likes Received:
    0
    Reputations:
    0
    Я переделал код, а именно функции которые делает поток и и меня выбивает такую ошибку:

    [​IMG]

    И выделяет эту строку:
     
  14. 1n0y

    1n0y Active Member

    Joined:
    9 May 2009
    Messages:
    272
    Likes Received:
    276
    Reputations:
    2
    сделай так в обоих случаях:
    ошибка пропадёт - будешь знать, в чем твой косяк. но нечего в этом страшного нет - обращайтесь к визуальным компонентам из потоков, ради бога, только знайте, что могут быть ошибки ;)


    upd: из потока ты обращаешься к
    т.е. будь у тебя 1000 потоков - каждый поток будет пытатся работать с этим компонентом, плюс, он наверняка еще и не создан.
    решение простое:
    объявляй IdHTTP глобальной переменной для потоков (либо в каждой процедуре, как тебе удобнее), в каждом потоке создавай IdHTTP и всё будет отлично. только убивать его потом не забывай.
     
    #14 1n0y, 15 Nov 2011
    Last edited: 15 Nov 2011
  15. Farcar

    Farcar Banned

    Joined:
    6 Nov 2011
    Messages:
    55
    Likes Received:
    0
    Reputations:
    0
    я переделал было все норм, еще немного переделал теперь такое окно выбивает

    [​IMG]
     
  16. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    http://forum.vingrad.ru/forum/s/3d39c48c35610a4cca2b839b584d6e94/topic-60076/anchor-entry480303/0.html

    точнее да, я неверно выразился. Обращатся можно но напрямую (без синхронизации) не нужно, из-за этого случаются глюки, или ексепшн "Canvas doesn't allow drawing"
     
  17. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    конкретнее про "правильно дергать" опишите пожалуйста.
    на данный момент мне известен один метод "правильного" дергания - synchronize. Знаете еще - поделитесь.
     
  18. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    погодите, так Вы именно про TCanvas, а у ТСа проблема с выводом в Label,
    та же проблема будет при выводе текста в мемо и еще много-много аналогичных проблем. (и у всех будут сообщения Canvas does not allow drawing)
    Про потокобезопасные методы у TCanvas - не спорю
     
    #18 xophet, 15 Nov 2011
    Last edited: 15 Nov 2011
  19. 1n0y

    1n0y Active Member

    Joined:
    9 May 2009
    Messages:
    272
    Likes Received:
    276
    Reputations:
    2
    даладно? вот хоть убейте, никаких проблем при выводе в мемо из сотни потоков у меня никогда небыло. в лэйбл да, не спорю, но в мемо без синхронайза - никогда.
    быстрее форма повиснет (даже с процессмэсаджами), чем получится увидеть данную ошибку.
     
  20. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    а еще бывает что в мемо ничего не заносится, бывает. я кидал ссылку на тему какеолы (пускай он и нуб) но у него была та же проблема. Может быть еще куча проблем из-за обращения из сторонних потоков к основному без синхронизации.
    То, что у Вас их не было, еще не значит, что их не бывает.
    К стати функция (как и процедура) ADD у TStrings не потокобезопасная, и при большом количестве потоков начинается лажа когда еще одна строка не добавилось, добавляется вторая. Так что синхронизация нужна, как ни крутите
     
    #20 xophet, 15 Nov 2011
    Last edited: 15 Nov 2011