diff --git a/Core/ComponentBaseClasses/elxMetricBase.hxx b/Core/ComponentBaseClasses/elxMetricBase.hxx index b883ad544..728b86505 100644 --- a/Core/ComponentBaseClasses/elxMetricBase.hxx +++ b/Core/ComponentBaseClasses/elxMetricBase.hxx @@ -19,6 +19,7 @@ #define elxMetricBase_hxx #include "elxMetricBase.h" +#include "elxConversion.h" namespace elastix { @@ -155,11 +156,17 @@ MetricBase::BeforeEachResolutionBase() thisAsAdvanced->SetUseMultiThread(useMultiThreading); if (useMultiThreading) { - std::string tmp = configuration.GetCommandLineArgument("-threads"); - if (!tmp.empty()) + if (const std::string commandLineArgument = configuration.GetCommandLineArgument("-threads"); + !commandLineArgument.empty()) { - const unsigned int nrOfThreads = atoi(tmp.c_str()); - thisAsAdvanced->SetNumberOfWorkUnits(nrOfThreads); + if (itk::ThreadIdType numberOfThreads{}; Conversion::StringToValue(commandLineArgument, numberOfThreads)) + { + thisAsAdvanced->SetNumberOfWorkUnits(numberOfThreads); + } + else + { + assert(!"This command-line argument should be checked already, by MainBase::SetMaximumNumberOfThreads()!"); + } } } diff --git a/Core/Kernel/elxMainBase.cxx b/Core/Kernel/elxMainBase.cxx index 0b6a57d1c..fd418365b 100644 --- a/Core/Kernel/elxMainBase.cxx +++ b/Core/Kernel/elxMainBase.cxx @@ -28,6 +28,7 @@ #include "elxMainBase.h" #include "elxComponentLoader.h" +#include "elxConversion.h" #include "elxMacro.h" #include "itkMultiThreaderBase.h" @@ -38,6 +39,7 @@ #endif #include +#include #include namespace elastix @@ -409,19 +411,28 @@ MainBase::SetProcessPriority() const void MainBase::SetMaximumNumberOfThreads() const { - /** Get the number of threads from the command line. */ - std::string maximumNumberOfThreadsString = m_Configuration->GetCommandLineArgument("-threads"); + // Get the number of threads from the command line. If supplied, set the maximum number of threads. + const auto commandLineKey = "-threads"; - /** If supplied, set the maximum number of threads. */ - if (!maximumNumberOfThreadsString.empty()) + if (const std::string commandLineArgument = m_Configuration->GetCommandLineArgument(commandLineKey); + !commandLineArgument.empty()) { - const int maximumNumberOfThreads = atoi(maximumNumberOfThreadsString.c_str()); - itk::MultiThreaderBase::SetGlobalMaximumNumberOfThreads(maximumNumberOfThreads); + if (itk::ThreadIdType numberOfThreads{}; Conversion::StringToValue(commandLineArgument, numberOfThreads)) + { + itk::MultiThreaderBase::SetGlobalMaximumNumberOfThreads(numberOfThreads); - // The following statement (getting and setting GlobalDefaultNumberOfThreads) may look redundant, but it's not - // (using ITK 5.4.0)! The Set function ensures that GlobalDefaultNumberOfThreads <= GlobalMaximumNumberOfThreads. - // (GlobalDefaultNumberOfThreads is important, as ITK uses this number when constructing the ThreadPool.) - itk::MultiThreaderBase::SetGlobalDefaultNumberOfThreads(itk::MultiThreaderBase::GetGlobalDefaultNumberOfThreads()); + // The following statement (getting and setting GlobalDefaultNumberOfThreads) may look redundant, but it's not + // (using ITK 5.4.0)! The Set function ensures that GlobalDefaultNumberOfThreads <= GlobalMaximumNumberOfThreads. + // (GlobalDefaultNumberOfThreads is important, as ITK uses this number when constructing the ThreadPool.) + itk::MultiThreaderBase::SetGlobalDefaultNumberOfThreads( + itk::MultiThreaderBase::GetGlobalDefaultNumberOfThreads()); + } + else + { + itkExceptionMacro("\"" << commandLineKey << "\" command-line argument \"" << commandLineArgument + << "\" must be a positive " << std::numeric_limits::digits + << "-bits number."); + } } } // end SetMaximumNumberOfThreads() diff --git a/Core/Main/elastix.cxx b/Core/Main/elastix.cxx index 8af61e22b..d0d265d81 100644 --- a/Core/Main/elastix.cxx +++ b/Core/Main/elastix.cxx @@ -201,9 +201,6 @@ main(int argc, char ** argv) } // end else (so, if key does not equal "-p") } // end for loop - /** The argv0 argument, required for finding the component.dll/so's. */ - argMap.insert(ArgumentMapEntryType("-argv0", argv[0])); - int returndummy{}; /** Check if at least once the option "-p" is given. */ diff --git a/Core/Main/elastixlib.cxx b/Core/Main/elastixlib.cxx index 55d380aac..64b6bcac1 100644 --- a/Core/Main/elastixlib.cxx +++ b/Core/Main/elastixlib.cxx @@ -162,10 +162,7 @@ ELASTIX::RegisterImages(ImagePointer fixedImage, /** Save this information. */ const auto outFolder = value; - const ArgumentMapType argMap{ /** The argv0 argument, required for finding the component.dll/so's. */ - ArgumentMapEntryType("-argv0", "elastix"), - ArgumentMapEntryType("-out", outFolder) - }; + const ArgumentMapType argMap{ ArgumentMapEntryType("-out", outFolder) }; /** Check if the output directory exists. */ if (performLogging && !itksys::SystemTools::FileIsDirectory(outFolder)) diff --git a/Core/Main/transformix.cxx b/Core/Main/transformix.cxx index c053c0032..4706fb679 100644 --- a/Core/Main/transformix.cxx +++ b/Core/Main/transformix.cxx @@ -187,9 +187,6 @@ main(int argc, char ** argv) } // end for loop - /** The argv0 argument, required for finding the component.dll/so's. */ - argMap.insert(ArgumentMapEntryType("-argv0", argv[0])); - /** Check that the option "-tp" is given. */ if (argMap.count("-tp") == 0) { diff --git a/Core/Main/transformixlib.cxx b/Core/Main/transformixlib.cxx index 3be22bb3e..b959c0b02 100644 --- a/Core/Main/transformixlib.cxx +++ b/Core/Main/transformixlib.cxx @@ -169,9 +169,6 @@ TRANSFORMIX::TransformImage(ImagePointer inputImage, } } - /** The argv0 argument, required for finding the component.dll/so's. */ - argMap.insert(ArgumentMapEntryType("-argv0", "transformix")); - /** Setup the log system. */ const elx::log::guard logGuard{}; int returndummy2 = elx::log::setup(logFileName, performLogging, performCout) ? 0 : 1;