Для чего это нужно?
Каков механизм действия?
ThreadSafe ?
Сообщений 1 страница 11 из 11
Поделиться118.02.2014 03:42:48
Поделиться218.02.2014 11:29:03
Для чего это нужно?
Нужно если в программе больше одного параллельного потоке.
Каков механизм действия?
Используются специальные потокобезопасные версии функций PB.
Поделиться319.02.2014 01:38:57
У меня в программе работает до 20 потоков одинакового назначения - каждый отслеживает заданный нод сети.
Выдает в экранную таблицу параметры.
Формирует HTML-файл с текущим состоянием для локального портала.
без ThreadSafe
организация доступа к общим ресурсам - к базе данных, к экранной таблице, к LinkedList - с помощью мютексов.
работала три месяца без проблем.
пользователи попросили добавить отправку алармов по Email.
выбирал из трех библиотек - остановился на PureSMTP_450
разграничение доступа - по glMailMutex
но программа начала
1. иногда выдавать в экранную таблицу куски отправляемого по Email текста
2. падать через разные промежутки времени.
включил ThreadSafe, отключил дебагер.
вроде куски текста в таблице перестали появляться.
но падает по прежнему - то через ~14мин, то через ~11, то через 15мин - от начала работы программы
Лог показал что падение происходит то через 7 мин после отправки последнего письма
то через 1 мин, то через 15мин
Т.е. явной связи не видно
перехват ошибок по OnErrorCall(@FatalError())
показавает ссылки на разные строки текста
по ошибка одна - "Invalid memory access"
Может коллективный опыт что нибудь посоветует как заставить программу устойсиво работать?
Поскольку свои идеи закончились - решил переделать программу избавившись от одинаковых параллельных потоков.
Поделиться419.02.2014 11:01:53
выбирал из трех библиотек - остановился на PureSMTP_450
Чем не подошла встроенная библиотека Mail?
включил ThreadSafe, отключил дебагер.
Правильно сделали что включили ThreadSafe, а вот отладчик отключать не стоило. Он не зря сообщает об ошибках и его отключение от них не избавит. Включите еще и Purifier, хз, может в программе есть чтение/запись за пределами выделенной памяти.
Может коллективный опыт что нибудь посоветует как заставить программу устойчиво работать?
Не видя кода сложно что-то сказать. Одно ясно - какой-то из ресурсов одновременно используется несколькими потоками. А то что падает в разных строках, говорит скорее всего об том, что проблема не в коде, а в одной из библиотек, и скорее всего это PureSMTP (если других в проекте нет).
Поделиться520.02.2014 03:33:54
переделал программу избавившись от одинаковых параллельных потоков .
сутки - полет нормальный.
Чем не подошла встроенная библиотека Mail?
нет возможности задать User/Password для входа на SMTP-сервер.
В Droopy's SendEmail() есть User/Password.
Но не смог задать дополнительные поля
например "Date: Thu, 13 Feb 2014 12:15:01 +1100" т.к. автоматически делает дату неправильно
и "Content-Type: text/plain; charset=windows-1251"
В PureSMTP_450 получилось все что хотел (на сегодняшний день).
Для установки charset есть такая функция
PureSMTP_SetContentType("text/plain; charset=windows-1251") ;PureSMTP
А дату принудительно формирую так
DateHeader$="Date: "+DayNames(DayOfWeek(Dat1))+", "+Str(Day(Dat1))+" "+MonthNames(Month(Dat1)-1)+" "+Str(Year(Dat1))+" "+FormatDate("%hh:%ii:%ss",Dat1)+" +1100"
и вставляю при отправке (см.последний параметр)
PureSMTP_SendMail(SendTo$, glMailFrom$, glMailSubject$+" at "+MyIP$, MailText$, "", glSMTPuser$, glSMTPpassword$, DateHeader$)
ThreadSafe пришлось отключить - компилятор выпадал по ошибке
Отредактировано SadStar (20.02.2014 03:37:23)
Поделиться620.02.2014 11:12:21
нет возможности задать User/Password для входа на SMTP-сервер.
Это разве не то что нужно?
SendMail(#Mail, Smtp$ [, Port [, Asynchronous [, User$, Password$]]])
http://purebasic.com/documentation/mail/sendmail.html
ThreadSafe пришлось отключить - компилятор выпадал по ошибке
Какой? Случайно не этой?
POLINK: error: Unresolved external symbol '_PB_StringBasePosition'.
Нужно выбрать подсистему UserLibThreadSafe.
Поделиться724.02.2014 02:42:53
Это разве не то что нужно?
SendMail(#Mail, Smtp$ [, Port [, Asynchronous [, User$, Password$]]])
В моем Хелпе написано только это
Result = SendMail(#Mail, Smtp$ [, Port [, Asynchronous]])
Какой? Случайно не этой?
POLINK: error: Unresolved external symbol '_PB_StringBasePosition'.
Сейчас уже не помню точно - но похоже.
Поделиться824.02.2014 08:43:54
Попробовал переделать так
SendMail(hMail, glSMTPserver$, 25, 0, glSMTPuser$, glSMTPpassword$)
компилятор пишет: некорректное число параметров
У меня v.4.51.
В связи с этим вопрос - стоит ли переходить на v.5?
Как там с совместимостью с младшими версиями?
Т.е. нужно ли будет переделывать старые программы в случае доработки?
И еще по библиотеке - не увидел где можно посмотреть текст ошибки при обломе отправки почты.
А в PureSMTP_450 есть PureSMTP_GetLastServerMessage()
Поделиться924.02.2014 13:50:36
компилятор пишет: некорректное число параметров
У меня v.4.51.
Нужно обновить до текущей версии.
Как там с совместимостью с младшими версиями?
Может придется немного изменить код, а может и нет, зависит от кода.
Поделиться1026.02.2014 04:11:37
Попробовал 5.21 на старом проекте
Сразу получил
WindowEvent() and WaitWindowEvent() can only be called from the main thread.
А у меня дополнительные окна открывались в отдельных потоках
и цикл обработки событий свой для каждого окна.
Удобно было - все в кучке для каждого окна - модульность.
А теперь все события всех окон в одном цикле обрабатывать?
P.S.
Попробовал новый Mail - charset установить не удалось.
Делал так
SetMailAttribute(hMail, #PB_Mail_Custom, "Content-Type: text/plain; charset=windows-1251"+#CRLF$)
в письме получалось так
Date: Wed, 26 Feb 2014 11:31:32 +1100 Content-Type: text/plain; charset=windows-1251 MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: quoted-printable
т.е. библиотека дописала свое
P.S.2
вместо
CreateMail(#PB_Any, glMailFrom$, glMailSubject$+" at "+MyIP$ , #PB_Ascii)
задал
CreateMail(#PB_Any, glMailFrom$, glMailSubject$+" at "+MyIP$ , #PB_UTF8)
и тогда charset - по барабану.
Отредактировано SadStar (26.02.2014 06:04:21)
Поделиться1126.02.2014 11:14:15
Сразу получил WindowEvent() and WaitWindowEvent() can only be called from the main thread.
Можно отключить отладчик при выполнении функций OpenWindow() и WaitWindowEvent().
DisableDebugger OpenWindow(....) EnableDebugger ; Код. DisableDebugger WaitWindowEvent() EnableDebugger
Похожие темы
PureBasic 6.10 | OffTop | 23.10.2024 |
PureBasic Pre/Post Processor (PurePProcessor) | OpenSource | 02.12.2023 |
PureBasic 6.00 | OffTop | 26.10.2024 |
PurePortable - портабелизация программ | OpenSource | 11.11.2024 |