|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
17.08.2011, 05:58 | #1 |
Форумчанин
Регистрация: 30.05.2011
Сообщений: 133
|
Подвисает программа на Delphi, которая считывает данные с COM-порта(весы), строит график
практика горит по делфи!
для практики в унивра надо было написать программу котороя считывает данные с ком порта(весы) и по ним строит график, вдвоем с еще 1 несчастным мы смогли понять как открывать и считывать данные, преобразовывать результат в адекватнй вид, но все это только отдельно и на маленький кусках данных, когда попытались сделать это все в одну функцию либо ничего не происходит либо она вешает программу помоги понять почему? и как это исправить, просто не понятно почему по отдельности все работает а пачкой нет ______________ Название темы по правилам форума должно адекватно отражать суть решаемой задачи/проблемы. на этот раз я исправил. Модератор. Последний раз редактировалось Serge_Bliznykov; 18.08.2011 в 20:16. |
18.08.2011, 02:42 | #2 |
Форумчанин
Регистрация: 30.05.2011
Сообщений: 133
|
и никто не знает почему это виснит?
|
18.08.2011, 18:51 | #3 |
Форумчанин
Регистрация: 10.12.2007
Сообщений: 124
|
просто чтоб вашем коде что то обнаружить, надо для начало много выпить. ))
ComPort подвисание возможно(скорее всего сдесь) WaitForSingleObject(FOverRead.hEven t, INFINITE) будет ждать до тех пор пока что нить не запишеться в ком порт оборудованием. raise приостоновит выполнение потока! ReadFile(FComPort.FPort, FBuf, FRead, FRead, @FOverRead) вместо второго FRead необхожимо отправить свободную переменую, она возврашает сколько же на самом деле прочиталось FBuf: array[0..$FF] of Byte; и в то же время FRead := ComStat.cbInQue; if FRead > 0 then if not ReadFile(FComPort.FPort, FBuf, FRead, FRead, @FOverRead) then Буфер может принять только 255 байт, а если даных будет больше?? затрет область памяти for i := Low(FBuf) to FRead - 1 do arrBytes[i] := FBuf[i]; FRead вы уверены что Fread будет содержать то число которое прочиталось исходя из выше написанного, я нет. Если уж используете Low для определения ижней границы, то используете High(вроде) для определения верхний границы а лучше (раз знакомы с ZeroMemory) используйте CopyMemory(@arr1[0], @arr2[0], FRead - 1) будет более быстрее чем цикл for тем более вы на это время тормозите поток из за Synchronize(DoRead); то же самое про for i := 0 to High(ReadBytes) do until (m > SIZE) or (found = true); // if (found = true) then // найдя совпадение (found = true) замените просто Found разницы не заметите след. коментарий просто убил // ппц я знаю, но я не знаю как сделать нормально вместо m := 0; // repeat // if simvolucs2[m] = c1 // которое ищем в массиве1 (метод "простого" перебора) then found := true else m := m + 1; // until (m > SIZE) or (found = true); // можно сделать var intPos: Integer; intPos := Pos(c1,simvolucs2[m]); if IntPos = 0 then // нет совпадений else // есть совпадения тоже комент убил for e := 0 to 11 do ListBox5.Items.Delete(0); // почему именно 0 я хз но почему то с 0 стирает нужные строки вы скорее всего с толкнудись с проблеймой, что если написать так ListBox5.Items.Delete(e); то почему то происходит ошибка, верно? Открою вам страшную тайну, когда вы удалили один элемент, то размер масивва Items стал меньше, и вы гдето на 5 шаге выйдите за границы массива во! а здесь то почему то догодались идти с конца массива for i := ListBox5.Items.Count - 1 downto 0 do if Trim(ListBox5.Items[i]) = '' then ListBox5.Items.Delete(i); str := ListBox1.Items.Count; Label2.caption := floattostr(str); эм.. 1. зачем это делать в цыкле 2. зачем использовать floattostr вместо IntToStr 3. можно либо в начале либо в конце Label2.caption := IntToStr(Length(ReadBytes)); for i := Low(arrBytes) to High(arrBytes) do arrBytes[i] := Ord(strWrite[i + 1]); ем какую Delphi используете? начинаея с Delphi 2006 вроде, вы получите то совсем то что хотете сделать.. а вот это пахнет утечкой памяти уже SetLength(arrBytes, Length(strWrite)); for i := Low(arrBytes) to High(arrBytes) do arrBytes[i] := Ord(strWrite[i + 1]); Port.Write(arrBytes); arrBytes := nil; - не освобождает память application.processmessages; раз он так вам нужен, то вставсте в цикл, вне цикла он вам не поможет все, на больше меня не хватило ))) больно весело.. мои пожелания вам, 1. Избавиться от всех Хинтов и Варнингов 2. Дать всем переменым человеческие имена, что бы было понятно что для чего используеться 3. unit ComPort; сделать одним классом - потоком 4. выделить участки кода в отдельные процедуры и функции 5. дать компонентам на форме так же человеческие имена 6. и еще раз вдумчиво посмотреть свой код,
Русский язык не мой конёк
|
20.08.2011, 09:55 | #4 | |||
Форумчанин
Регистрация: 30.05.2011
Сообщений: 133
|
сразу расскажу подробней про ситуацию, программу делаем ради практики с однокурсником, с ком портами не работали даже на лекциях не было а тут такое чудо, он начинал делать кусок открытия порта и получения данных(есть подозрение что на основе чего того из инета =) )
я немного не точно описал проблему тк поддался своего рода панике, программа считывает с порта данные в виде ascii, если сохранить кусок данных то можем их переводить с помощью того бреда который по ошибке называется кодом ) проблемы начинаются когда попались все загнать в одну "кнопку". Цитата:
по первым 2м пунктам нет проблем понятно а вот 3,4 проблемы - нас учили в универе что в поток и функции отдельные можно помещать только абстрактные уравнения которые работают с переменными в которых отдельно загоняются данные, вопрос как в поток загнать такую конструкцию как открытие порта, Цитата:
Цитата:
хорошо\плохо? тут как раз выскакивает вопрос а что будет если это будет работать с непрерывным поток(лавина) данных седьмую суть в том что надо заставить программу принимать и переводить данные в норм вид а реальном времени (что самое сложное для меня тк остался щас один человек с кем делал щас уехал оставив мне то что я сюда выложил) а дальше я уже как то сам сделаю дайте ответы на те вопросы, пару хороших статей про потоки и функции а то я не понимаю до конца что делать а от того что мне написали я вабще испугался |
|||
21.08.2011, 12:03 | #5 |
Форумчанин
Регистрация: 30.05.2011
Сообщений: 133
|
это добрая традиция ждать ответа на форуме 2е суток?
забыл сказать спасибо модератору за исправление названия |
22.08.2011, 09:39 | #6 |
Форумчанин
Регистрация: 30.05.2011
Сообщений: 133
|
Код:
остальное работает норм вроде вы скорее всего с толкнудись с проблеймой, что если написать так ListBox5.Items.Delete(e); то почему то происходит ошибка, верно? нет нету ошибки "сообщения" просто стирались не те строки вот и все тайну ту знал а вот как сделать это симпатичней я не знаю) и это ответь кто нить хоть что то понятное для начинающего, очень надо Последний раз редактировалось SonicBob; 23.08.2011 в 02:51. Причина: пара ошибок в предложениях |
23.08.2011, 05:12 | #7 |
Форумчанин
Регистрация: 30.05.2011
Сообщений: 133
|
народ вы же клуб ПРОграмистов что сложного ответить новичку? просмотров почти 200 один 1 это не тема это блог какой то
|
23.08.2011, 07:23 | #8 |
Александр
Администратор
Регистрация: 28.10.2006
Сообщений: 17,501
|
Давайте вариант где не загнанов в одну кнопку и который работает.
Возможно, простой. Application.ProcessMessages между блоками разного кода вам поможет. |
23.08.2011, 10:38 | #9 |
Форумчанин
Регистрация: 30.05.2011
Сообщений: 133
|
откопал самый первый вариант других не осталось
Код:
Код:
Application.ProcessMessages между блоками не помогло Последний раз редактировалось SonicBob; 23.08.2011 в 10:42. |
23.08.2011, 18:48 | #10 |
Форумчанин
Регистрация: 30.05.2011
Сообщений: 133
|
есть еще идеи у кого?мои то давно закончились
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Разработать программу, которая строит график Функция y =Cos x. | bajge | Общие вопросы Delphi | 2 | 16.06.2011 18:55 |
программа, которая считывает цепочку чисел и печатает наиболее длинную, монотонно возрастающую их подпосл | alexb81 | Помощь студентам | 3 | 31.05.2011 14:03 |
Delphi, почему не строит график? | xMass | Помощь студентам | 10 | 30.03.2009 20:32 |
Программа строит неправильный график | xMass | Помощь студентам | 7 | 06.06.2008 19:04 |
Как считывать данные с COM,LPT порта и нарисовать график | Sergiu | Фриланс | 2 | 22.12.2007 11:53 |