В значительной степени все используют , getopt
Здесь является примером кода для документа:
import getopt, sys
def main():
try:
opts, args = getopt.getopt(sys.argv[1:], "ho:v", ["help", "output="])
except getopt.GetoptError:
# print help information and exit:
usage()
sys.exit(2)
output = None
verbose = False
for o, a in opts:
if o == "-v":
verbose = True
if o in ("-h", "--help"):
usage()
sys.exit()
if o in ("-o", "--output"):
output = a
Так, одним словом, вот то, как это работает.
у Вас есть два типа опций. Те, кто получает аргументы и тех, кто точно так же, как переключатели.
sys.argv
в значительной степени Ваш char** argv
в C. Как в C Вы пропускаете первый элемент, который является названием Вашей программы и синтаксического анализа только аргументы: sys.argv[1:]
Getopt.getopt
проанализирует его согласно правилу, которое Вы даете в аргументе.
"ho:v"
здесь описывает короткие споры: -ONELETTER
. :
средства, что -o
принимает один аргумент.
Наконец ["help", "output="]
описывает длинные споры (--MORETHANONELETTER
). =
, после того, как произведено еще раз средства, которые производят, принимают аргументы.
результатом является список пары (опция, аргумент)
, Если опция не принимает аргумента (как [1 112] здесь) arg
, часть является пустой строкой. Вы тогда обычно хотите циклично выполниться в этом списке и протестировать имя опции как в примере.
я надеюсь, что это помогло Вам.
Хорошо, я нашел проблему Я сделал ! clrstack -p а затем! do на частях system.net, и выяснилось, что проблемный поток был System.net.Servicepoint, указывающим на наш smtp-сервер.
Погуглил и обнаружил, что это проблема http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=337557 также описано здесь http://www.vbforums.com/showthread.php?t=584384 Это проблема, связанная с тем, что точка обслуживания неправильно отправляет команду выхода и отключается. Они собираются решить эту проблему в .net 4.0
Теперь мне просто нужно закодировать обходные пути, чтобы убедиться, что точка обслуживания закрывается, и это должно работать out
Спасибо за помощь
Вы всегда можете остановить процесс с помощью отладчика и пару раз проверить трассировку стека. Если поток часто не простаивает и находится в одном и том же месте, вы будете знать немного больше о том, где он все время тратит.
В вставленном вами материале я вижу только трассировку стека для одного потока, можете ли вы получить стек трассировка для всех потоков? (Извините, если это не так, я привык делать это в основном в unix)
Используйте ProcDump , чтобы получить дамп памяти, когда ЦП загружается. Затем проверьте стеки вызовов всех потоков. Также запустите perfmon и продолжайте проверять поток, который использует большую часть процессора. Надеюсь, это поможет
Если вы можете присоединить отладчик, то некорректно работающие потоки обычно будут тем потоком, который возникает, когда вы «Разбейте все».
В противном случае я бы, вероятно, сделал несколько снимков местоположения этих потоков и посмотрите, есть ли какие-либо потоки, которые постоянно не находятся в режиме ожидания (например, WaitForMultipleObjectEx). Это должно дать вам представление о том, какие потоки работают неправильно и какой код они обычно выполняют.
И убедитесь, что у вас нет кода вроде:
while(1)
;
:)