Пишу программу с потоками, потоки загружают строку из файла, обробатуют ее отсылают на сервер методом пост и обратывают ответ, вконце выдает ошибку, Что не правильно???
исключение в классе, неправильная операция, canvas неподдерживает отрисовку. Какой вопрос, такой и ответ. Выкладывай код...
/showpost.php?p=2724229&postcount=7 подробнее рассматривалось в Этой /showthread.php?t=280152 теме. там много срача, но суть уловите. ИЗ ПОТОКОВ НЕЛЬЗЯ ОБРАЩАТЬСЯ К ВИЗУАЛЬНЫМ КОМПОНЕНТАМ Прежде чем использовать их в своей программе, почитайте литературу. в ссылках выше есть линки на винград, там очень хорошая тема
признаюсь чесно, код нашел в сети, добавил и переделал пару строк, и вот что вышло, запрос отправляется, но в конце ошибка
на днях уже была тема с этим кодом и аналогичной проблемой. Code: if Thread=0 then ShowMessage('OK'); вот этого в потоке делать нельзя. ТОлько через Synchronize
я кинул ссылки, читайте. от того, что я за Вас сейчас напишу код Вы умнее не станете. А если прочитаете, то вполне возможно, что толк будет
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; А как мы с Вами знаем обращатся к визуальным компонентам из потока нельзя.
Я переделал код, а именно функции которые делает поток и и меня выбивает такую ошибку: И выделяет эту строку:
сделай так в обоих случаях: ошибка пропадёт - будешь знать, в чем твой косяк. но нечего в этом страшного нет - обращайтесь к визуальным компонентам из потоков, ради бога, только знайте, что могут быть ошибки upd: из потока ты обращаешься к т.е. будь у тебя 1000 потоков - каждый поток будет пытатся работать с этим компонентом, плюс, он наверняка еще и не создан. решение простое: объявляй IdHTTP глобальной переменной для потоков (либо в каждой процедуре, как тебе удобнее), в каждом потоке создавай IdHTTP и всё будет отлично. только убивать его потом не забывай.
http://forum.vingrad.ru/forum/s/3d39c48c35610a4cca2b839b584d6e94/topic-60076/anchor-entry480303/0.html точнее да, я неверно выразился. Обращатся можно но напрямую (без синхронизации) не нужно, из-за этого случаются глюки, или ексепшн "Canvas doesn't allow drawing"
конкретнее про "правильно дергать" опишите пожалуйста. на данный момент мне известен один метод "правильного" дергания - synchronize. Знаете еще - поделитесь.
погодите, так Вы именно про TCanvas, а у ТСа проблема с выводом в Label, та же проблема будет при выводе текста в мемо и еще много-много аналогичных проблем. (и у всех будут сообщения Canvas does not allow drawing) Про потокобезопасные методы у TCanvas - не спорю
даладно? вот хоть убейте, никаких проблем при выводе в мемо из сотни потоков у меня никогда небыло. в лэйбл да, не спорю, но в мемо без синхронайза - никогда. быстрее форма повиснет (даже с процессмэсаджами), чем получится увидеть данную ошибку.
а еще бывает что в мемо ничего не заносится, бывает. я кидал ссылку на тему какеолы (пускай он и нуб) но у него была та же проблема. Может быть еще куча проблем из-за обращения из сторонних потоков к основному без синхронизации. То, что у Вас их не было, еще не значит, что их не бывает. К стати функция (как и процедура) ADD у TStrings не потокобезопасная, и при большом количестве потоков начинается лажа когда еще одна строка не добавилось, добавляется вторая. Так что синхронизация нужна, как ни крутите