Что нового

Мультипоточность

Prog

Продвинутый
Сообщения
537
Репутация
65
Yashied [?]
И ведь не поспоришь. С другой стороны, если говорить о WinAPI (а мы обсуждаем именно его), Handle и ID имеют совершенно разный смысл. Handle - индекс в системной таблице, которая содержит адрес структуры (32/64-бит), а ID - просто число. Хотя, есть и исключения.
PB рассчитан также на новичков в программировании, которым будет понятнее значение слова "идентификатор" чем "хендл".
Но если не нравятся имена функций, можно использовать WinAPI вместо функций PB, хорошо что с этим проблем нет и они доступны из коробки.

Из-за своей кроссплатформенности этот ЯП лишился удобоваримости и многих полезных плюшек.
WinAPI никто не отменял.

qqww22 [?]
Можно реализовать многопоточность через dll путём передачи бинарного кода Autoit с запуском в потоке.
Может чего-то не знаю, но AutoIt не генерирует машинный код из скрипта. Он его интерпретирует по мере выполнения.

Yashied сказал(а):
Лучше бы для каждой платформы была своя модификация PB.
И затруднилась бы переносимость кода между платформами.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Prog сказал(а):
И затруднилась бы переносимость кода между платформами.
Да и черт с ним. Проблем было бы не больше, чем переход от одной к другой версии PB (еще один костыль). В любом случае, написание универсального кода Windows/Linux/MacOS ничего хорошего не сулит. В большинстве случаев код пишут для одной конкретной платформы.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Yashied [?]
аписание универсального кода Windows/Linux/MacOS ничего хорошего не сулит
Java-программисты не согласны с тобой ;D
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Yashied,
У меня вот такой вопрос. Если из dll (PureBasic), при создании потока, возвращается его handle (ThreadID(i_Thread)), через который отслеживается ход его выполнения, надо ли после его завершения (GetExitCodeThread возвращает значение не равное STILL_ACTIVE) закрывать его handle (CloseHandle) или он закрывается автоматом при завершении потока? (Функция CloseHandle возвращает 1).
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
madmasles [?]
Если это так, то это не плюс PureBasic, ИМХО.
Не рубите вы так с плеча, это вполне нормальная практика. Сам хэндл - это "указка" на системный объект и его информацию. Если объект уничтожен(не важно каким способом), то зачем закрывать хэндл? Мало ли пользователю потребуется узнать ExitCode и/или прочую информацию.
 

Prog

Продвинутый
Сообщения
537
Репутация
65
Все закрывается. Иначе система не выдавала одни и те же числовые значения хендла.
Код:
Procedure YourProcedure(*Value)
  Delay(2)
EndProcedure

Repeat
  h=CreateThread(@YourProcedure(), 23)
  Debug ThreadID(h)
  Delay(100)
ForEver
Еще одно доказательство того что хендл закрывается это то, что объем памяти программы и число дескрипторов не увеличивается.
 

The Dream

Новичок
Сообщения
393
Репутация
3
Yashied, мне кажется что PB действительно лучше AutoIt только в одном - многопоточности, то есть то, что с этим можно работать. Удобства, как в AutoIt, конечно нет, как и многопоточности. Я как-то перешел на него, но например из-за отсутствия библиотек по работе с COM IE, вынужден был перейти обратно. Но мне, кажется, что многопточность все же весомый плюс.. (не всегда без нее можно обойтись).
 

Prog

Продвинутый
Сообщения
537
Репутация
65
Zalman1980 [?]
мне кажется что PB действительно лучше AutoIt только в одном - многопоточности
У каждого ЯП свои достоинства и недостатки, а также цели использования.
Когда необходима автоматизация, у AutoIt огромное преимущество перед другими ЯП, потому что он создан для этого.
Но у всех задачи разные и далеко не всегда это автоматизация, и тогда AutoIt теряет свое преимущество.
 

The Dream

Новичок
Сообщения
393
Репутация
3
Prog [?]
Но у всех задачи разные и далеко не всегда это автоматизация, и тогда AutoIt теряет свое преимущество.

Кстати, я вот думаю, на современных компьютерах ведь спокойно можно вместо потоков использовать процессы и работать с ними через потоки... Все таки современные компьютеры уже достаточно производительны для такой прихоти)
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Prog [?]
Иначе система не выдавала одни и те же числовые значения хендла.
Вы выдаете не "числовые значения хэндла", а идентификатор потока по известному хэндлу.

Повторяться можно бесконечно, но речь идет о устройстве системы и примитивной логике. Единственное, на что я обратил бы внимание в вашем случае - это "потеря" хэндла ввиду использования одной переменной H. Вполне вероятно PureBasic учитывает это недопущение и автоматически вызывает CloseHandle, что не касается случая описанного выше.
 

Prog

Продвинутый
Сообщения
537
Репутация
65
firex [?]
Вы выдаете не "числовые значения хэндла", а идентификатор потока по известному хэндлу.
Нет. ThreadID возвращает именно хендл потока.

Вполне вероятно PureBasic учитывает это недопущение и автоматически вызывает CloseHandle, что не касается случая описанного выше.
В переменной может быть все что угодно и подобные действия не производятся, т. к. небезопасны. Вопрос решается на уровне системы, которая закрывает хендлы завершенных потоков и производится это судя по всему, при создании очередного потока в контексте текущего процесса.

Zalman1980 [?]
Для чего-то более или менее не подойдет или сложности синхронизации переменных нескольких процессов.
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Prog [?]
Вопрос решается на уровне системы, которая закрывает хендлы завершенных потоков и производится это судя по всему, при создании очередного потока в контексте текущего процесса.
Чушь.

Нет. ThreadID возвращает именно хендл потока.
Вы передаете хэндл что бы получить хэндл? Прекратите вводить людей в заблуждение.
http://www.purebasic.com/documentation/thread/threadid.html
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
firex [?]
Вы передаете хэндл что бы получить хэндл? Прекратите вводить людей в заблуждение.
CreateThread() в PureBasic возвращает внутренний номер потока, который можно использовать только в данном скрипте (как, например, DllOpen() в AutoIt), а ThreadID() возвращает его handle по этому номеру.
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
madmasles
Странноватый ЯП, забираю слова обратно на счет автоматического закрытия, но с уверенностью скажу - это дела не системные, возможно PureBasic закрывает сам хэндл.
 

Prog

Продвинутый
Сообщения
537
Репутация
65
Верх