由于IT限制,我无法使用Android SDK的package-install-automation.
为了能够在Androids的AVD管理器中创建模拟器,我首先需要为我的目标设备提供系统映像.但是关于下面的截图,我没有安装任何.
所以任何人都可以告诉我:1.从何处获取Android 6.0 API Level 23的系统映像2.如何手动/离线安装此系统映像
先感谢您!
android android-virtual-device android-sdk-2.3 android-studio
对于我的用例,我必须非常快速地从列表中插入和删除数据包.
在我看来,有两种常见的解决方法:
无论如何,我认为使用指针的解决方案应该是最有效的,即使你自己的垃圾收集的缺点.
为了更好的比较,我实现了3个测试用例:
为了测量每个测试用例的时间,我还实现了一个计时器类:
class HighPerformanceTimer {
public:
enum TimerResolution {
SECONDS = 1,
MILLISECONDS = SECONDS * 1000,
MICROSECONDS = MILLISECONDS * 1000,
NANOSECONDS = MICROSECONDS * 1000
};
explicit HighPerformanceTimer(const TimerResolution resolution = NANOSECONDS)
: m_resolution(resolution)
, m_frequency(0.0)
, m_startTime({0})
, m_stopTime({0}) {}
~HighPerformanceTimer(void) {}
bool Init(void) {
LARGE_INTEGER frequency;
if(0 == ::QueryPerformanceFrequency(&frequency)) {
return false;
}
/* Check for zero divisor. */
if(0 == frequency.QuadPart) {
return false;
}
/* Change …Run Code Online (Sandbox Code Playgroud) 众所周知,应避免使用const_cast来删除指针的常量.
但是另一种方式呢?
对于我的用例,我有一个从非const源缓冲区复制数据(字节)的函数.我认为一个好的设计决定是根据源缓冲区完全const来声明参数.
void copyfunction(const char* const data) { ... }
Run Code Online (Sandbox Code Playgroud)
对于像下面这样的函数调用,这将导致指针类型错误'const char*const < - > char*'.
void main() {
char sourcebuffer[] = {0x00};
copyfunction(sourcebuffer);
}
Run Code Online (Sandbox Code Playgroud)
当然,现在我可以简单地声明sourcebuffer为const,但在我的情况下,我无法访问该变量,因为它来自不同的代码位置(外部库).
void main() {
char sourcebuffer[] = {0x00};
copyfunction(const_cast<const char* const>(sourcebuffer));
}
Run Code Online (Sandbox Code Playgroud)
然而,超出的代码可以工作,但它是好的风格(根据我的用例)?
我认为声明copyfunctionas const 的参数可以确保用户不修改(只读)指针或源缓冲区本身的位置.所以在这种情况下,const_cast只是启用函数调用的必要之恶,而不是故意删除指针的常量......
电贺
我刚刚意识到我的APC被另一个线程打断了.所以在这一点上我想知道这是怎么回事.据我了解APC的概念:
所以这是我最初的情况:我有一个多线程应用程序(1个主线程,1个接收线程).较低优先级的接收线程是从外部源接收数据.接收线程也通过使用重新激活WaitForSingleObject().接收的数据存储在共享中std::list.主线程实际上没有任何效果.每隔x毫秒发生一次特殊事件,导致接收线程调度APC.此APC在主线程的上下文中运行.
所以这里是整个情况的示例伪源代码.
class Example {
public:
Example(void) {
::DuplicatHandle(
::GetCurrentProcess(),
::GetCurrentThread(),
::GetCurrentProcess(),
&m_mainthreadHandle,
THREAD_SET_CONTEXT,
FALSE,
0);
}
void run(void) {
::WaitForSingleObjectEx(m_apcActivation);
}
protected:
private:
void rxThread(void) {
// this seems to be called during the apcRoutine() is running
// as result the shared list m_rxList is corrupted!
::WaitForSingleObject(m_externalActivation);
Data data = externalReceive();
if(data.attribute == SPECIAL) {
::QueueUserAPC(apcRoutine, m_mainthreadHandle, 0);
} else {
m_rxList.push_front(data);
}
}
void apcRoutine(void) {
while(!m_rxList.empty()) {
m_rxList.front().print();
m_rxList.pop_front(); …Run Code Online (Sandbox Code Playgroud)