PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



ThreadSafe ?

Сообщений 1 страница 11 из 11

1

Для чего это нужно?
Каков механизм действия?

0

2

SadStar написал(а):

Для чего это нужно?

Нужно если в программе больше одного параллельного потоке.

SadStar написал(а):

Каков механизм действия?

Используются специальные потокобезопасные версии функций PB.

0

3

У меня в программе работает до 20 потоков одинакового назначения - каждый отслеживает заданный нод сети.
Выдает в экранную таблицу параметры.
Формирует HTML-файл с текущим состоянием для локального портала.
без ThreadSafe
организация доступа к общим ресурсам - к базе данных, к экранной таблице, к LinkedList - с помощью мютексов.
работала три месяца без проблем.

пользователи попросили добавить отправку алармов по Email.
выбирал из трех библиотек - остановился на PureSMTP_450
разграничение доступа - по glMailMutex

но программа начала
1. иногда выдавать в экранную таблицу куски отправляемого по Email текста
2. падать через разные промежутки времени.

включил ThreadSafe, отключил дебагер.
вроде куски текста в таблице перестали появляться.
но падает по прежнему - то через ~14мин, то через ~11, то через 15мин - от начала работы программы

Лог показал что падение происходит то через 7 мин после отправки последнего письма
то через 1 мин, то через 15мин
Т.е. явной связи не видно

перехват ошибок по OnErrorCall(@FatalError())
показавает ссылки на разные строки текста
по ошибка одна - "Invalid memory access"

Может коллективный опыт что нибудь посоветует как заставить программу устойсиво работать?

Поскольку свои идеи закончились - решил переделать программу избавившись от одинаковых параллельных потоков.

0

4

SadStar написал(а):

выбирал из трех библиотек - остановился на PureSMTP_450

Чем не подошла встроенная библиотека Mail?

SadStar написал(а):

включил ThreadSafe, отключил дебагер.

Правильно сделали что включили ThreadSafe, а вот отладчик отключать не стоило. Он не зря сообщает об ошибках и его отключение от них не избавит. Включите еще и Purifier, хз, может в программе есть чтение/запись за пределами выделенной памяти.

SadStar написал(а):

Может коллективный опыт что нибудь посоветует как заставить программу устойчиво работать?

Не видя кода сложно что-то сказать. Одно ясно - какой-то из ресурсов одновременно используется несколькими потоками. А то что падает в разных строках, говорит скорее всего об том, что проблема не в коде, а в одной из библиотек, и скорее всего это PureSMTP (если других в проекте нет).

0

5

переделал программу избавившись от одинаковых параллельных потоков .
сутки - полет нормальный.

Пётр написал(а):

Чем не подошла встроенная библиотека 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)

0

6

SadStar написал(а):

нет возможности задать User/Password для входа на SMTP-сервер.

Это разве не то что нужно?

SendMail(#Mail, Smtp$ [, Port [, Asynchronous [, User$, Password$]]])

http://purebasic.com/documentation/mail/sendmail.html

SadStar написал(а):

ThreadSafe пришлось отключить - компилятор выпадал по ошибке

Какой? Случайно не этой?

POLINK: error: Unresolved external symbol '_PB_StringBasePosition'.

Нужно выбрать подсистему UserLibThreadSafe.

0

7

Пётр написал(а):

Это разве не то что нужно?

    SendMail(#Mail, Smtp$ [, Port [, Asynchronous [, User$, Password$]]])


В моем Хелпе написано только это

Код:
Result = SendMail(#Mail, Smtp$ [, Port [, Asynchronous]])
Пётр написал(а):

Какой? Случайно не этой?

    POLINK: error: Unresolved external symbol '_PB_StringBasePosition'.


Сейчас уже не помню точно - но похоже.

0

8

Попробовал переделать так

Код:
SendMail(hMail, glSMTPserver$, 25, 0, glSMTPuser$, glSMTPpassword$)

компилятор пишет: некорректное число параметров

У меня v.4.51.

В связи с этим вопрос - стоит ли переходить на v.5?
Как там с совместимостью с младшими версиями?
Т.е. нужно ли будет переделывать старые программы в случае доработки?

И еще по библиотеке - не увидел где можно посмотреть текст ошибки при обломе отправки почты.
А в PureSMTP_450 есть PureSMTP_GetLastServerMessage()

0

9

SadStar написал(а):

компилятор пишет: некорректное число параметров
У меня v.4.51.

Нужно обновить до текущей версии.

SadStar написал(а):

Как там с совместимостью с младшими версиями?

Может придется немного изменить код, а может и нет, зависит от кода.

0

10

Попробовал 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)

0

11

SadStar написал(а):

Сразу получил WindowEvent() and WaitWindowEvent() can only be called from the main thread.

Можно отключить отладчик при выполнении функций OpenWindow() и WaitWindowEvent().

Код:
DisableDebugger
OpenWindow(....)
EnableDebugger
; Код.
DisableDebugger
WaitWindowEvent()
EnableDebugger

0