Я пытаюсь реорганизовать некоторый код из основной формы, где он работал отлично, в модуль, где он не работает.Замена Me.BeginInvoke() при рефакторинге на модуль
В рабочей версии вся информация, поступающая через последовательный порт, обрабатывается надлежащим образом. Тем/делегаты созданы здесь, что конец, когда они успешно преобразуют информацию в соответствии с гигантской PLM() функция ниже:
Когда я переехал все это в модуль, большая часть кода работает отлично , Мне удалось получить объект SerialPort, созданный и обработанный надлежащим образом в модуле. Я могу отправлять подключения к последовательному порту просто отлично и все, однако Me.BeginInvoke() не может быть использован в модуле. Я обнаружил, что вместо того, чтобы вместо этого обрабатывать обработчик(), он создает один поток, и он будет обрабатывать одну команду, но обычная потоковая обработка больше не происходит. Так что обработчик() не был правильным выбором того, что я должен здесь положить.
Я почти ничего не известно о том, пронизывающих работы, чтобы быть полностью честным, и я знаю, что код не работает правильно вращается в основном вокруг этой одной линии, я просто не имею ни малейшего понятия, что это должно быть.
Редактировать: Давайте посмотрим, смогу ли я предоставить лучшую информацию. (Удивительно, что я могу наберешь downvote перед любым Ответчик понимает, что мне нужно или не нужно!)
Я не хочу, чтобы внести существенные изменения в структуре этих методов, если я могу помочь ему, потому что Я все еще пытаюсь понять их и держать их достаточно параллельно оригинальному источнику.
объяснение оригинального автора о том, что он делает, может быть более полезным, чем мое собственное понимание: http://www.madreporite.com/insteon/receiving.html
В Visual Basic 2005 (это также относится и к 2008 году), объект SerialPort присваивается свой собственный поток и работает параллельно с остальной частью вашего приложения. В принципе это означает, что он может идти в ногу с последовательным устройством, независимо от того, с чем связана основная программа. Тем не менее, объекты и подпрограммы в одном потоке сильно ограничены в их способности взаимодействовать с объектами и подпрограммами в других потоках, а это значит, что, хотя есть событие SerialPort_Datareceived, вы очень ограничены тем, что вы можете сделать в нем. Даже если вы записываете последовательные данные в глобальную переменную, если вы также меняете эту переменную из другого потока, данные могут легко потеряться, поскольку они мешают друг другу.
В результате я создал массив байтов. Событие SerialPort_Datareceived записывает байты в массив и обновляет указатель, чтобы указать добавленный последний байт. Затем событие будет вызывать подпрограмму делегата в основном потоке (что в основном означает попросить другой поток выполнить эту подпрограмму, по своему усмотрению, без параметров), которые в конечном итоге будут выполняться. Подпрограмма в другом потоке наблюдает (но никогда не меняет) указатель и массив, чтобы увидеть, какие данные вошли, используя собственный указатель для запоминания последнего байта, который он обработал. Указатель и массив могут меняться во время выполнения этой другой подпрограммы.
Поскольку я не действительно возвращая любую информацию пользовательского интерфейса, я не думаю, что это обязательно должно быть «UI нить» с ней.
Edit2: Если PLM() функция уже предназначена для правильной работы, даже если есть несколько экземпляров, работающих одновременно, и я особенно не нужно синхронизировать поток пользовательского интерфейса, может я просто огонь от каждого экземпляра в новом потоке, используя System.Threading.Thread как-то вместо этого?
Для вызова функции BeginInvoke() требуется ссылка на объект Form или Control. Поэтому вам нужна другая переменная в вашем модуле. В общем, вы должны, по крайней мере, иметь один из «главного» окна, которое всегда вокруг. Назначьте переменную модуля в своем конструкторе. Если смерть и отчаяние звонят по телефону, тогда Application.OpenForms (0) может это сделать. –
Код на самом деле ничего не возвращает в пользовательский интерфейс, в настоящее время все, что он делает, на самом деле является WriteEntry в журнале событий. Надеюсь, я смогу получить функциональность этого, не передав форму как-нибудь. – ocdtrekkie