@Evheniu said in как отключить тач:
выслал, спасибо
Как повторить эту ошибку?
support911.gif
Проблем с мнопоточностью при таком подходе разве не будет?
Может же случиться так, что два потока одновременно обратятся к файлу.
Нет, не будет. В БАС есть 2 типа действия - синхронные и асинхронные. Синхронные выполняются в одном потоке. Среди асинхронных - работа с браузером, хттп клиентом, работа с ресурсами, поиск файлов. Установка переменных, запись и чтение файлов - синхронные.
(задача в итоге была решена с помощью работы с несколькими аккаунтами в одном потоке и использовании нескольких переменных для хранения переменных номера и количества активаций)
Рад, что удалось решить проблему.
@support у меня сейчас есть схожая задача по сути. Перечитал этот топик, но решения (элегантного) так и не узрел )
нужно синхронное, блокируемое (lock) действие взять строку из списка (пусть просто глобальная переменная с массивом). А еще лучше возможность заблокировать глобальную видимость (всех глобальный переменных) и пока этот блок действует, то все остальные потоки будут покорно ожидать ее разблокировки, чтобы они могли с нее считать/записать.
Т.е. поток 1 собирается что-то сделать с global var, он сперва вешает замок на эту global var или вообще на всю global area и после этого начинает что-то там делать с ней, читать/писать. В этот период другие потоки , когда доходят до какого-то действия с global var, перед его выполнением, они проверяют не висит ли на ней блокировка, если висит, то ждут пока не разблокируется.
это пример с глобальной переменной, но мне это не важно, пусть будет любой способ хранить инфу, пусть файл..
Попытаюсь очень ясно описать задачу:
Может такое реализуется с помощью ресурсов ? Там вроде как синхронная работа идет, есть возможность обновлять содержимое, также там есть одновременное использование для 1 го потока только. Но подробная механика их работы мне не ясна, по этому вот уточняю, подходят ли они под описанную задачу.
Также, раз работа с файлами синхронная , то по сути это все можно решить с помощью записи и удаления строк из файла. Т.е. все потоки, когда им нужна строка из веба, то перед тем , как ее получать из веба, они ищут ее в файле, если в файле строк нет, то берет из веба, после отработки один раз, записывает в файл и ее уже подхватит другой поток. Но перед тем , как записать ее в файл, но проверит , сколько раз строка уже использовалась, если 2, то отбой. Если 1, то запишет в файл.
Не хватает простого механизма: создать список (!!! доступный всем потокам) , взять от туда строку с удалением, чтобы не досталось нескольким потокам по одинаковой строке. + Добавить строку в конец, чтобы дальнейшие потоки, могли ее получить в процессе работа.
Уж прости, что дохера текста ) Но зато суть задачи описаны с разных сторон , вроде.
зы: что-то мне сдается, что все описанное выше можно решить вот этим

в OnAppStart указать создание ресурса с приблизительно такими параметрами:

Что значит "ждать появления" ? Это наверное, если ресурс пуст, то действие взятия строки с ресурса будет ждать, пока там что-то не появится. Но для меня вариант не подходит, т.к. если ресурс пуст, то нужно пойти дальше и получить нужные данные с веба. Значит эту опцию не включаем.
Дальше брать из ресурса строку так:

Обернуть взятие из ресурса строки в Игнор ошибок (на случай, если ресурс пуст).
Дальше уже по статусу ошибки, решать брать данные с веба или нет.
После взятия вызывать "Удалить Текущий Элемент".
@out
В БАС есть 2 фичи:
Грубо говоря, если в коде нет функции, которая заканчивается на ! sleep(1000)! load("google.com")! и т. д., то она синхронная.
Можно создать список(или таблицу, удобней для данной задачи) и хранить его в глобальной переменной, во время смены его содержимого можно не боятся, что управление перейдет во второй поток, и он нарушит целостность данных.
Вот пример - такой код всегда будет выводить 0, если бы правило 1). не работало, он бы выводил не 0 значение.
Еще в будущем будет действие "Блокировка Потока" такое как игнорировать ошибки, только оно позволит блокировать кусок кода в котором есть асинхронные функции.
@support said in Многопоточное использование ресурсов-текстовых файлов как списков:
Можно создать список(или таблицу, удобней для данной задачи) и хранить его в глобальной переменной, во время смены его содержимого можно не боятся, что управление перейдет во второй поток, и он нарушит целостность данных.
меня вот что беспокоило:
так вот , во время "опасной зоны" потоки другие не смогут считать значение глобальной переменной? Потому что так и нужно, они не должны иметь возможность считать ее, иначе они получат те же данные, что и поток 1.
@out said in Многопоточное использование ресурсов-текстовых файлов как списков:
так вот , во время "опасной зоны" потоки другие не смогут считать значение глобальной переменной? Потому что так и нужно, они не должны иметь возможность считать ее, иначе они получат те же данные, что и поток 1.
Нет, не смогут. В это время остальные потоки вообще работать не будут, при условии что в опасной зоне все действия синхронные.
@out А еще лучше тему в вики дополнить про многопоточность. Но хочу добить фреймы сначала.
@out said in Многопоточное использование ресурсов-текстовых файлов как списков:
так вот , во время "опасной зоны" потоки другие не смогут считать значение глобальной переменной? Потому что так и нужно, они не должны иметь возможность считать ее, иначе они получат те же данные, что и поток 1.
Еще уточню на счет файлов. Возьмем примеры выше, только вместо глобальной переменной пусть будет файл, то к нему это также применимо ? :
@support said in Многопоточное использование ресурсов-текстовых файлов как списков:
Нет, не смогут. В это время остальные потоки вообще работать не будут, при условии что в опасной зоне все действия синхронные.
Ведь чтение/запись в файл синхронные (ты вроде это писал где-то).
@out Да, операции с файлами тоже синхронные.
@out Исключение - поиск файлов, он асинхронный. Также хочу обратить внимание, что получение ресурсов тоже асинхронная операция. Так что ресурсы нужно сохранять в переменные до критической секции.
@Antonio said in Многопоточное использование ресурсов-текстовых файлов как списков:
А выведение в лог и ожидание ("спать") - синхронные или асинхронные?
Добавь эти действия, и открой вкладку Скрипт, если код действия будет заканчиваться на ! то оно асинхронное.