android input模块开启等待线程卡死

这几天在写一个input驱动程序,功能是用一个中断读取三个按键的键值并且上报,自己的想法是在模块开启时开启一个等待线程并且睡眠,当中断到来时唤醒它用timer扫描按键值。写好烧进手机后手机一直无法开机,在启动时卡死并且重启。去掉这个等待线程程序就运行正常了,本人对等待线程这一块不是很理解,希望各位大神指导。另外,当读到键值的时候使用input_key_report函数上报的时候没有反应,不知道是不是设备注册有什么问题·····头好痛····
代码如下:

#include "ExternalPanel.h"
#include
//#include
#include
#include
#include

#define EXPANEL_NAME "external_panel"

#define KEY_PRESS_FLAG 1
#define KEY_RELEASE_FLAG 0
//#define KEY_NEXT_FLAG 1
//#define KEY_PAUSE_FLAG 2
#define KEY_PRESS_PAUSE 0
#define KEY_PRESS_UP 1
#define KEY_PRESS_DOWN 2
#define KEY_PRESS_NONE 3
/*

    MD              UP                DW

|---------||-----------||----------|
0V<=MD< =0.2V 0.3V<= UP<=0.6V 0.8<=DW <=1.4V

*/

#define DW_KEY_HIGH_THR (1400) //1400000uv
#define DW_KEY_THR (800) //
#define UP_KEY_HIGH_THR (600) //
#define UP_KEY_THR (300)
#define MD_KEY_HIGH_THR (200)
#define MD_KEY_THR (0)

#define EXPANEL_KEY_ADC_CHANNEL 0
#define KEY_REF_VOLT 1500
static struct input_dev *expanel_input_dev;
struct workquenue_struct *expanel_eint_workquenue;
struct work_struct expanel_enit_work;
struct wake_lock expanel_irq_lock;
static struct hrtimer key_scan_timer;
static wait_queue_head_t scan_queue;
static struct task_struct *scan_kthread;
static int scan_state=0;

//static u8 expanel_state = !KPD_SLIDE_POLARITY;
static int expanel_input_open(struct input_dev dev);
extern void mt65xx_eint_unmask(unsigned int line);
extern void mt65xx_eint_mask(unsigned int line);
extern void mt65xx_eint_set_polarity(kal_uint8 eintno, kal_bool ACT_Polarity);
extern void mt65xx_eint_set_hw_debounce(kal_uint8 eintno, kal_uint32 ms);
extern kal_uint32 mt65xx_eint_set_sens(kal_uint8 eintno, kal_bool sens);
extern void mt65xx_eint_registration(kal_uint8 eintno, kal_bool Dbounce_En,
kal_bool ACT_Polarity, void (EINT_FUNC_PTR)(void),
kal_bool auto_umask);
static void expanel_eint_handler(void);
void expanel_eint_work_callback(struct work_struct *work);
int check_key_type(int b);
int getExPanelVoltage(void);
void report_key_event(int keycode,int flag);
static void expanel_key_detection(void);
//extern int PMIC_IMM_GetOneChannelValue(int dwChannel, int deCount, int trimd);
extern int IMM_GetOneChannelValue(int dwChannel, int data[4], int
rawdata);
void key_scan_hrtimer_init(void);
enum hrtimer_restart key_scan_hrtimer_func(struct hrtimer *timer);
int key_wait_scan_thread(void *x);
int key_get_voltage(void);
static int expanel_probe(struct platform_device *pdev)
{
ExPanel_DEBUG("expanel_input!\n");
expanel_input_dev = input_allocate_device();
if (!expanel_input_dev)
{
ExPanel_DEBUG("expanel_input_device alloc failed!\n");
return 12;
}
//define multi-key keycode
set_bit(EV_KEY, expanel_input_dev->evbit);
//
set_bit(KEY_CALL, expanel_input_dev->keybit);
//__set_bit(KEY_ENDCALL, expanel_input_dev->keybit);
// set_bit(KEY_NEXTSONG, expanel_input_dev->keybit);
// __set_bit(KEY_PREVIOUSSONG, expanel_input_dev->keybit);
__set_bit(KEY_PLAYPAUSE, expanel_input_dev->keybit);
//
set_bit(KEY_STOPCD, expanel_input_dev->keybit);
__set_bit(KEY_VOLUMEDOWN, expanel_input_dev->keybit);
__set_bit(KEY_VOLUMEUP, expanel_input_dev->keybit);

expanel_input_dev->id.bustype = BUS_HOST;
expanel_input_dev->name = "expanel_key";
//expanel_input_dev->open = expanel_input_open;
expanel_input_dev->dev.parent = &pdev->dev;
if(input_register_device(expanel_input_dev))
{
    ExPanel_DEBUG("expanel_input_dev register : fail!\n");
}else
{
    ExPanel_DEBUG("expanel_input_devregister : success!!\n");
} 

 expanel_eint_workquenue = create_singlethread_workqueue("expanel_eint");
  INIT_WORK(&expanel_enit_work, expanel_eint_work_callback);

   wake_lock_init(&expanel_irq_lock, WAKE_LOCK_SUSPEND, "expanel irq wakelock");


   scan_state=0;
  mt65xx_eint_set_sens(CUST_EINT_EXPANEL_NUM , CUST_EINT_EXPANEL_SENSITIVE);
  mt65xx_eint_set_hw_debounce(CUST_EINT_EXPANEL_NUM, 10);
  mt65xx_eint_registration(CUST_EINT_EXPANEL_NUM, true, CUST_EINT_EXPANEL_POLARITY, 
            expanel_eint_handler, false);
mt65xx_eint_unmask(CUST_EINT_EXPANEL_NUM);  
   scan_kthread=kthread_run(key_wait_scan_thread, NULL, "key_wait_scan_thread");


return 0;

}

static int expanel_input_open(struct input_dev dev)
{
/

wake_lock_init(&expanel_irq_lock, WAKE_LOCK_SUSPEND, "expanel irq wakelock");

   scan_state=0;
   init_waitqueue_head(&scan_queue);
  mt65xx_eint_set_sens(CUST_EINT_EXPANEL_NUM , CUST_EINT_EXPANEL_SENSITIVE);
  mt65xx_eint_set_hw_debounce(CUST_EINT_EXPANEL_NUM, 10);
  mt65xx_eint_registration(CUST_EINT_EXPANEL_NUM, true, CUST_EINT_EXPANEL_POLARITY, 
            expanel_eint_handler, false);
mt65xx_eint_unmask(CUST_EINT_EXPANEL_NUM);  
 key_wait_scan_thread();

*/

return 0;

}

void expanel_eint_handler(void)
{

ExPanel_DEBUG( " [ExPanel] expanel_key_handler \n");
/*
//mt65xx_eint_mask(CUST_EINT_EXPANEL_NUM);
scan_state=0;
//wake_up(&scan_queue);

 wake_lock(&expanel_irq_lock);
 // expanel_key_detection();
 if(0==scan_state)
{
ExPanel_DEBUG("[Expanel] key_scan_hrtimer_init scan_state:%d\n",scan_state);
//wake_up_interruptible(&scan_queue);
wake_up(&scan_queue);
}
else
  {
    scan_state=0;
  hrtimer_cancel(&key_scan_timer); 
//mt65xx_eint_mask(CUST_EINT_EXPANEL_NUM);
}

//ExPanel_DEBUG( " [ExPanel]  expanel_key_handler \n");

   wake_unlock(&expanel_irq_lock);
ExPanel_DEBUG("[Expanel] Expanel_eint_handler ret:%d\n");
*/
int ret=0;
ret = queue_work(expanel_eint_workquenue, &expanel_enit_work);  
  if(!ret)
  {
    ExPanel_DEBUG("[Expanel] Expanel_eint_handler ret:%d\n",ret);
  }

}
void expanel_eint_work_callback(struct work_struct *work)
{
//int key_type=0;
mt65xx_eint_mask(CUST_EINT_EXPANEL_NUM);

 wake_lock(&expanel_irq_lock);
// wake_up_interruptible(&scan_queue);
 // expanel_key_detection();
if(0==scan_state)
{
ExPanel_DEBUG("[Expanel] key_scan_hrtimer_init scan_state:%d\n",scan_state);
wake_up_interruptible(&scan_queue);
}
else
  {
    scan_state=0;
  key_scan_hrtimer_init();
//mt65xx_eint_mask(CUST_EINT_EXPANEL_NUM);
}
//ExPanel_DEBUG( " [ExPanel]  expanel_key_dection key_type:%d \n",key_type);

wake_unlock(&expanel_irq_lock);
mt65xx_eint_unmask(CUST_EINT_EXPANEL_NUM);

}

int key_wait_scan_thread(void x)
{
ktime_t ktime;
ktime = ktime_set(0, 100*1000*1000); // 3s, 10
1000 ms
hrtimer_init(&key_scan_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
key_scan_timer.function = key_scan_hrtimer_func;
/* Run on a process content */

// mutex_lock(&adckey_mutex);

// mutex_unlock(&adckey_mutex);
//battery_xlog_printk(BAT_LOG_CRTI, "adckey: wait_evnet \n" );

wait_event_interruptible(scan_queue, (0==scan_state));
scan_state=1;
//wait_event(scan_queue, (0==scan_state));
hrtimer_start(&key_scan_timer, ktime, HRTIMER_MODE_REL);
printk("[DEVICE/EXPANEL]:key_wait_scan_thread wake up!\n");

return 0;

}

void key_scan_hrtimer_init(void)
{
ktime_t ktime;
ktime = ktime_set(0, 100*1000*1000); // 3s, 10* 1000 ms
hrtimer_init(&key_scan_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
key_scan_timer.function = key_scan_hrtimer_func;
ExPanel_DEBUG( "key_scan_hrtimer_init : done\n" );
}

enum hrtimer_restart key_scan_hrtimer_func(struct hrtimer *timer)
{
ktime_t ktime;
ktime = ktime_set(0, 100*1000*1000);

ExPanel_DEBUG( " ExPanel_DEBUG: come in key_check!!\n" );

hrtimer_start(&key_scan_timer, ktime, HRTIMER_MODE_REL);
return HRTIMER_NORESTART;
}
int check_key_type(int b)
{

ExPanel_DEBUG("cExPanel_DEBUG: come in key_check!!\n");
if((b<=DW_KEY_HIGH_THR)&&(b >= DW_KEY_THR)) 
{
    ExPanel_DEBUG("ExPanel_DEBUG adc_data: %d mv\n",b);
    return KEY_PRESS_DOWN;
} 
else if ((b <=UP_KEY_HIGH_THR)&& (b >= UP_KEY_THR))
{
    ExPanel_DEBUG("ExPanel_DEBUG adc_data: %d mv\n",b);
    return KEY_PRESS_UP;
}
else if ((b <= MD_KEY_HIGH_THR) && (b >= MD_KEY_THR))
{
    ExPanel_DEBUG("ExPanel_DEBUG adc_data: %d mv\n",b);
    return KEY_PRESS_PAUSE;
}
ExPanel_DEBUG("ExPanel_DEBUG: leave key_check!!\n");
return KEY_PRESS_NONE;

}

void report_key_event(int keycode,int flag)
{
// if(call_status == 0)
// {
ExPanel_DEBUG(" report_key_event\n");
switch (keycode)

{
case KEY_PRESS_DOWN:
input_report_key(expanel_input_dev, KEY_VOLUMEDOWN, flag);
input_sync(expanel_input_dev);
ExPanel_DEBUG("KEY_NEXTSONG %d\n",flag);
break;

              case KEY_PRESS_UP:
        input_report_key(expanel_input_dev, KEY_VOLUMEUP, flag);
            input_sync(expanel_input_dev);
    ExPanel_DEBUG("KEY_PREVIOUSSONG %d\n",flag);
    case KEY_PRESS_PAUSE:
    input_report_key(expanel_input_dev,KEY_PLAYPAUSE, flag);
            input_sync(expanel_input_dev);
    ExPanel_DEBUG("KEY_PAUSE %d\n",flag);
     break;

            }

}
#if 0
else
{
switch (keycode)
{
case DW_KEY:
input_report_key(expanel_input_dev, KEY_VOLUMEDOWN, flag);
input_sync(expanel_input_dev);
ACCDET_DEBUG("KEY_VOLUMEDOWN %d\n",flag);
break;
case UP_KEY:
input_report_key(expanel_input_dev, KEY_VOLUMEUP, flag);
input_sync(expanel_input_dev);
ACCDET_DEBUG("KEY_VOLUMEUP %d\n",flag);
break;
}
}
#endif
}

static void expanel_key_detection(void)
{
//int current_status = 0;
//int index = 0;
//int count = long_press_time / (KEY_SAMPLE_PERIOD + 40 ); //ADC delay
int m_key = 0;
//int cur_key = 0;
int cali_voltage=0;

   ExPanel_DEBUG("[ExPanel_DEBUG]  expanel_key_detection! \n");
//cali_voltage = getExPanelVoltage();
cali_voltage=key_get_voltage();
ExPanel_DEBUG("[ExPanel_DEBUG]adc cali_voltage1 = %d mv\n", cali_voltage);
//ACCDET_DEBUG("[Accdet]adc cali_voltage final = %d mv\n", cali_voltage);
m_key= check_key_type(cali_voltage);

//
report_key_event(m_key, KEY_PRESS_FLAG);
report_key_event(m_key, KEY_RELEASE_FLAG);

}

int key_get_voltage(void)
{
int i = 0, bat_id_vol = 0, data[4] = {0,0,0,0};

int res =0;

int rawdata=0;

for(i = 0; i < 3; i++)       

{

res = IMM_GetOneChannelValue(EXPANEL_KEY_ADC_CHANNEL,data,&rawdata);
if(res < 0)

{
printk("[DEVICE/EXPANEL]: get data error\n");
break;

}

else

{
printk("[DEVICE/EXPANEL]: channel0[%d]raw =%d\n",i,rawdata);
}

msleep(5);

bat_id_vol += (rawdata * KEY_REF_VOLT / 4096);
printk("DEVICE/EXPANEL: channel0[%d]vol =%d\n",i,rawdata * KEY_REF_VOLT / 4096);
}

if(res < 0) /*get adc value fail*/

return;

bat_id_vol = bat_id_vol/3;

return bat_id_vol;

}

static int expanel_remove(struct platform_device *pdev)
{
//cancel_delayed_work(&accdet_work);
kthread_stop(scan_kthread);
hrtimer_cancel(&key_scan_timer);
destroy_workqueue(expanel_eint_workquenue);
input_unregister_device(expanel_input_dev);
ExPanel_DEBUG("[ExPanel_DEBUG]ExPanel_remove Done!\n");
return 0;
}

static struct platform_device expanel_dev = {
.name = EXPANEL_NAME,
.id = -1,
};

static struct platform_driver expanel_drv = {
.probe = expanel_probe,
.remove = expanel_remove,
.driver = {
.name = EXPANEL_NAME,
.owner= THIS_MODULE,
},
};

static int __init expanel_mod_init(void)
{
ExPanel_DEBUG("expanel_input_device init!\n");
platform_device_register(&expanel_dev );
platform_driver_register(& expanel_drv );

return 0;

}

static void __exit expanel_mod_exit(void)
{
platform_device_unregister(&expanel_dev);
platform_driver_unregister(& expanel_drv );
}

module_init(expanel_mod_init);
module_exit(expanel_mod_exit);
MODULE_LICENSE("GPL");

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Android主线程等待子线程执行结果
1.场景描述nn在主线程复杂逻辑中,有时候想获取网络数据或者其他一些必须放在子线程中操作的业务时,一般都要新开线程,等待线程执行完成之后使用Handler发送到主线程,然后主线程再往下执行,这样的多次切换会造成逻辑复杂难懂.可不可以直接在主线程等待一小段时间,等线程处理完成之后再继续往下执行?nn2.实现主线程等待线程返回结果(以解析域名为例)nn解析域名的类nnpublic class Host
Android 自定义相机第二次打开卡死
原因:相机没有被正确释放导致第二次打卡死。n//正确的释放资源代码n public void release(){n if (mCamera != null) {n mCamera.setPreviewCallback(null) ;n mCamera.stopPreview();n mCamera.releas...
操作系统实验-并发程序设计
多线程并发设计,了解如何创建线程,开启线程,等待线程,怎样在程序中启动一个可执行文件
ExecutorService等待线程完成后优雅结束
1.概述n该ExecutorService框架可以很容易地在处理多线程任务。我们将举例说明我们等待线程完成执行的一些场景。n此外,我们将展示如何正常关闭ExecutorService并等待已经运行的线程完成其执行。n2.Executor关闭后n使用Executor时,我们可以通过调用shutdown()或shutdownNow()方法将其关闭。虽然,它不会等到所有线程都停止执行。n等待现有线程完成...
Win32线程——等待另一个线程结束
《Win32多线程程序设计》–Jim Beveridge & Robert Wienern “等待某个什么东西”是线程常常需要做的事。等待是线程的“必要之恶”。 n 如果你没有等待线程结束就莽撞地结束程序,线程会被系统强制结束掉——在它完成它的工作之前。 n 由于让线程停工是操作系统的责任,很合理地我们会认为操作系统也有责任让其他线程知道某个线程停工了。nSleep()这个函数要求操作系统中止
Android Studio打开项目卡死的问题
Android Studio每次打开项目都会去校验当前项目使用的gradle和build tools的版本,如果有不一致,就会进行网络下载,这本是一件极好的事情,但大家都懂的,由于墙的问题,遇到不一致时,我们的Android Studio就成功的卡死了。n之前试过好多办法,删除项目中不必要的文件夹,文件,让项目自己生成gradle项目文件,或者去修改部分配置,由于是遇到一个问题就查询一个问题,导
windows多线程(二) 等待线程返回
多线程编程中,有时我们需要等待某一线程完成了特定的操作后再继续做其他事情,要实现这个目的,可以使用Windows API函数WaitForSingleObject,或者WaitForMultipleObjects。这两个函数都会等待Object被标为有信号(signaled)时才返回。只要是Windows创建的Object都会被赋予一个状态量。如果Object被激活了,或者正在使用,那么该Obje...
Java中等待线程执行完毕
前言:前一段时间在做项目的时候,某段代码中用到了多线程,该处代码需要开启多个线程,待这几个线程执行完毕后再接着执行后续的流程。现将可采用的方法记录如下。n要达到上述的描述的情形,可以使用Thread的join()方法,也可以使用java.util.concurrent包中的CountDownLatch类。具体如下:一、使用Thread.join()方法该方法在JDK API中的解释为“等待该线程终止
VC++ 中主线程等待子线程结束的方法
void WaitForThreadExit(void)n{n DWORD dwRet; //返回值n MSG msg; n int wait_count=4; //线程句柄有4个n int nExitThreadCount=0; //记录线程退出个数n n while(1)n {n dwRet = MsgWaitForMultipleObj...
解决input[type=file]打开时慢、卡顿问题
经过测试发现,在mac里面safari、Firefox、Chrome(opera不知道为啥老闪退)都没有卡顿问题rnrn在windows里面,Firefox不卡顿,只有Chrome卡顿。rnrn然而,这个插件是从另一个项目里面借用过来,再加上了限定图片类型的功能而已。 rn原组件并没有这个卡顿问题,那么问题只可能是在限定图片类型这点上了。rnrn先贴上我的代码rn    accpet="image
linux c之使用pthread_create创建线程pthread_join等待线程和pthread_exit终止线程总结
1、介绍APIn1、pthread_create函数nn函数简介npthread_create是UNIX环境创建线程函数n头文件n#includen函数声明nint pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrict_attr,void*(*start_rtn)(void*),void *re
pthread_join 望文生义害死人
第一次当看到pthread_join(),我的字面理解是将一个thread加入到系统调度队列去,然后,有然后, 看代码就晕乎了。rnrnrn其实pthread_join这个函数的作用是:rnpthread_join使一个线程等待另一个线程结束。代码中如果没有pthread_join主线程会很快结束从而使整个进程结束,从而使创建的线程没有机会开始执行就结束了。加入pthread_join后,主线程会
python中多线程
多线程基本概念:线程:进程中的每个子任务,不能独立存在,CPU执行的最小单位进程:独立的所有子任务的集合即:多个线程 组成 进程import threadingprint([x for x in range(9)])thread = threading.current_thread() #返回当前的线程变量thread.setName('主线程')print('thread name:',thre...
Android 华为手机卡在启动页不动,卡死情况
今天开发项目用了公司新入的测试机华为mate 10,一开始调试都没有问题,运行了几次后APP一启动就卡在启动页不动了,打印了一下日志看了一下发现报如下异常:norg.json.JSONException: End of input at character 0 ofn导致这个异常信息的错误是因为在nJSONObject object=new JSONObject(jsonString);n1n这行...
chrome浏览器input[type=file]选择zip、exe等文件卡顿解决办法
在chrome浏览器下,使用input[type=file]上传,点击打开对话框,选择.zip、exe、apk等文件后,再次点击打开对话框,则出现卡顿现象,大概会在5~10秒,经过排查搜索,发现是chrome浏览器自带的问题,但是观察一些上传组件确发现没有卡顿问题,因此拿出jquery-file-upload上传插件对源码进行分析,情况如下:nnn nnnn经过分析,发现jquery
解决android studio在真机调试的时候 工程卡死,真机offline的问题
进入android sdk的安装目录,cmd->cd 你的目录,到目录sdk\platform-tools下面,有个shell脚本,adb.exe执行命令 adb kill-server 杀掉进程,然后重启adb start-server 即可。
Android中为什么主线程不会因为Looper.loop()里的死循环卡死?
这个问题很简单,概念理解问题,不需要把app启动源码牵扯进来搞得很复杂。rn程序无响应:主线程执行任务时间较长,导致其他需要立刻在主线程处理的事件无法得到处理。rn线程阻塞:线程处于等待状态rn线程结束:线程的run方法返回rn阻塞与程序无响应没有必然关系,虽然主线程在没有消息可处理的时候是阻塞的,但是只要保证有消息的时候能够立刻处理,程序是不会无响应的。rn阻塞与线程退出也没有必然联系,线程完全可以在不阻...
手机加密后,OTA升级过程中冻屏分析报告
ota升级,android系统优化界面卡死
开启Android Apk调试与备份选项的Xposed模块的编写
在进行Android应用程序逆向分析的时候,经常需要进行Android应用程序的动态调试,一般情况下基于Android应用程序的安全性考虑,发布版的Android应用程序都会关闭它的调试选项,因此只有开启该Android应用程序的调试选项,才能在Android应用程序的Activity界面显示之前(即Application类的attach函数和onCreate函数执行之前)使Android应用程序...
线程等待一定时间和及时返回继续执行,以及等待线程退出。
创建线程后让线程定时执行,可以通过sleep(time).rn但我们一般可以通过在使用WaitForSingleObject(HANDLE handle,rn DWORDdwMilliseconds)来等待。rn如果不让线程做等待过程的返回操作,便可直接使用线程句柄等待即可。rnDWORD WINAPICGisOper::VehStatusThread(LPVOID pParam)rn{rn   
Java之 join 等待线程终止
njoin : 当前等待其他线程执行结束 之后 再继续执行n        线程一:开始执行,执行过程中暂停,让线程二开始执行,当线程二执行结束后,线程一接着执行void join() :等待该线程终止 nnnex:nnnpublic class Demo {n public static void main(String[] args) {n Download d = new Download...
点击程序的输入框卡死问题的解决
最近突然出现一个问题,VS编译出来的程序,鼠标第一次点击到一个输入框就会出现长时间的等待,大概10几秒。rn怀疑跟输入法有关,卸掉了搜狗输入法问题还是存在,再重新安装搜狗输入法问题消失。rnrnrn还不清楚背后的根本原因是什么
No6.等待线程结束(join)和通知(notify)
先看 join例子:rnpublic class JoinMain {n n public volatile static int i = 0;n n public static class AddThread extends Thread {n public void run () {n for(i=0;i<1000000;i++);n }n }n n public static voi
安卓关于使用V4L2操作usb摄像头 暂停后恢复视频流卡死的问题
开一个线程读取帧nvoid keep_read_frame(void * ptr) {nint index;n// unsigned char buffer[len];nunsigned char * bbb = calloc(1, fimc_buffers[0].length);nfd_set readFds;nFD_ZERO(&readFds);nFD_SET(fd, &read
Ubuntu下Genymotion模拟器启动卡死
Description想必搞过Android开发的童鞋都清楚,模拟器都会使用Genymotion,毕竟有个人开发者的版本,并且速度还很快。 n但是最近遇到了这样一个问题,启动模拟器的时候,会在starting virtual device窗口卡死,任尔东西南北风,哥哥还是岿然不动。loglibGL error: unable to load driver: radeonsi_dri.sonlibGL
kotlin 线程基础
1.创建线程n在 kotlin中,有三种方式可以创建线程n1.继承Thread类nobject : Thread() {n override fun run() {n println(&quot;running from Thread: ${Thread.currentThread()}&quot;)n }n}.start()nn2.使用Runnable类初始化Th...
解决android studio死机卡死卡缓慢问题的实践
之前使用eclipse,后来google公司自己推出了一个安卓的开发工具android studio,并且渐渐的停止对eclipse的兼容和支持,所以我也从eclipse跳到使用androidstudio了,但是android studio使用起来时不时的出现死掉卡机卡顿,让我很郁闷,只能干巴巴等着他恢复过来,为了缓解甚至解决这个问题,我采用了两种方法:n方法1:升级自己的电脑配置,我家里的电脑
Android 网络请求模块
前言nn目前的移动流量越来越便宜,手机内存也越来越大。随着Android 手机多年的发展,用户对Android 系统的接受度、认可度越来越高,加之Android 系统的开源性,更多的移动硬件接入Android生态系统,物联网和人工智能的时代来临了,我们进入了一个全新的人工智能时代,万物联网,一切都为智能而生,与此同时,人们对移动终端请求网络的速度和效率要求也越来越苛刻。网络请求的流畅性决定了一款a...
Protel99四核补丁
四核CPU处理速度过快,会导致Protel99开启时卡死
ubuntu14.04中php模块mcrypt无法正常启用怎么办
sudo apt-get install php5-mcrypt libmcrypt4 libmcrypt-devcd /etc/php5/apache2/conf.d/nsudo ln -s ../../mods-available/mcrypt.ini ./20-mcrypt.ininsudo service apache2 restart重启Nginx和PHP应该就可以了。
Android使用百度地图息屏30分钟后界面卡死
最近在项目中遇到一个百度地图点击不动的问题:在fragment中布局mapview后,手机放置30分钟以上,百度界面卡死,无法操作,其余的项目可以操作,这是由于未将mapview的生命周期添加到fragment生命周期中,奇怪的是,在百度地图的readme文件中,只说明了activity需要添加对应的生命周期,而fragment中并未添加
boost::thread新建线程如何不阻塞
boost::thread
android input子系统分析---驱动层
前言:rnInput子系统包括标准Linux,Android核心驱动,Android相关设备驱动,G-sensor的设备驱动程序。传感器作为rn一种输入设备,也是通过input系统把其数据上报给系统,或者通过input系统得到用户的配置信息。这里以传感器rn为例学习input driver层。rnSensor驱动从通过I2C从寄存器中读取sensor值,然后写入/dev/input/目录下对应的文
解决APP界面卡死Bug
猜测可能原因rnrn1、底部Tabbar隐藏、显示调用频繁,或者重复调用rn2、右划返回手势冲突rnrn研究历程rn1、多次使用,发现出现的情况多在一级页面跳转到二级页面,Tabbar卡死,点Home键切换APP到后台,重新打开,右划返回后即可使用rnrn得出结果rn1、在RootViewController右划返回手势也可以响应,因为没有上一级页面,导致整个程序页面不响应rnrnAPP做出如下修
C++11线程学习之等待线程结束
       一旦我们开启了新线程后,就需要决定是要等待这个线程结束还是将其设置为分离状态(自行运行,与父线程没什么关系了)。如果不等待线程运行结束的话,有一个问题我们需要注意:必须确保该线程结束前访问到的数据都是有效的,否则会引发异常或输出一些预料之外的结果。  实例一://-----------main.cppn#include &amp;lt;iostream&amp;gt;n#include &amp;lt;th...
input标签在Android中的使用小记
input 标签在Android中的使用小记最近遇到个需求,html页面有个<input type="file" /> 标签需要调用客户端的拍照跟选择照片功能,在iOS上面可以正常调起拍照,选择照片。但是在Android上却没有反应,当然这也是我意料之中的事情。n 遇到问题当然就想办法去解决了,我先打开了biying搜索,全都是爬的别人写的博客,千篇一律没有任何价值,于是上了stackoverfl
Java高并发--等待线程结束和谦让
针对本格专题我们主要讨论join()和yield()这两个方法。rn一、等待线程结束rn如果我们想要在一个线程中获取到另外一个线程的处理结果,那么 这个时候我们该怎么办呢?最好的方式当然就是等待另一个线程的结束后再来执行当前线程,这个时候就该我们的join()方法上场了。rn注意:这个方法一共有两个重载方法,传入了时间参数的重载方法表示等待固定的时间,如果在等待的时间结束后等待的线程还没有执行完,
NFC问题分析之死锁引起的ANR
对于Android平台的工程师来说,ANR应该是每个人都会遇到的问题,因为导致它的原因有很多,例如在主线程进行耗时操作,调用大量cpu资源进行复杂的预算等,并且可能在大多数情况下,这类问题不会发生,只会在极端特殊的情况下暴露(例如很长时间的自动化脚本测试,monkey测试),所以我们必须得学会如何去分析这类问题,才能让模块的性能经得住考验。
Android开发之input子系统一
一、了解rn Android系统主机默认携带input子系统,并且开机就会产生默认的mouse和keyboard事件,这样使得用户开机就可以触屏点击和使用按键。可通过adb shell getevent 命令看到用户input事件产生的信息。Android系统主机也支持链接遥控设备(蓝牙遥控器,dongle遥控器(2.4G),鼠标,键盘等)并根据遥控设备向系统注册的信息,系统生成对应的input事件
Android 死机问题分析方法收集
android 常见死机问题-如何分析nnhttps://blog.csdn.net/lansefeiyang08/article/details/17438759nnandroid 动态库死机调试方法nnhttps://blog.csdn.net/andyhuabing/article/details/7074979nnandroid 常见死机问题--log分析nnhttps://blog...
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 学习大数据电脑卡死 python基础教程之模块